Как сравнить значение свойства в нескольких объектах массива?

Как я могу сравнить значение свойства в нескольких объектах массива? У меня есть несколько объектов в массиве x.

var arr = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}, ...]

Я хочу сравнить и вернуть истину, если значение 'a' одинаково для всех объектов в массиве

Используйте каждый, array.every(el => el.a === 1).

rmn 13.09.2018 21:02

Так в чем проблема? Это кажется довольно тривиальным делом, с какой конкретной проблемой вы столкнулись?

VLAZ 13.09.2018 21:02

Я действительно хочу вернуть истину, если значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:22

@VLAZ не нужно отказываться от поддержки. Я думаю, что вопрос очень ясный.

RandomDeveloper 16.07.2021 10:53

@Rpx в то время, когда я оставил комментарий, вопрос был другой. Он попросил проверить, является ли a1 во всем массиве. Позже выяснилось, что OP хочет проверить, является ли aтакой же независимо от значения.

VLAZ 16.07.2021 12:26

Да, я все еще думаю, что иногда людям просто нужно слишком много объяснять, и это трудно изложить все в письменной форме, поэтому есть поддерживающие способы попросить людей улучшить свои вопросы. В противном случае их оттолкнет отсутствие поддержки, и их навыки не улучшатся.

RandomDeveloper 16.07.2021 12:29
2
6
1 921
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я бы использовал Array.reduce:

const data1 = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}];
const data2 = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}, {a: 2}];

data1.reduce((acc, item) => acc && item.a === 1, true); // true
data2.reduce((acc, item) => acc && item.a === 1, true); // false

Для получения true, если значение a одинаково для всех объектов в массиве, я бы использовал Array.prototype.some с простой инверсией:

!data1.some((item, index, list) => item.a !== list[index && 1 - 1].a); // true
!data2.some((item, index, list) => item.a !== list[index && 1 - 1].a); // false

Здесь я ищу первый элемент в списке, у которого есть свойство a, которое не соответствует свойству a предыдущего элемента. Элемент с нулевым индексом будет пропущен, он будет сравниваться с самим собой (index && 1 - 1 - это просто 0, если индекс - 0). Результат инвертируется с помощью !, поэтому у меня будет true, если ничего не найдено.

Я действительно хочу вернуть истину, если значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:24

@ChrisJake Я обновил ответ, чтобы удовлетворить ваше второе требование с подходом some

dhilt 14.09.2018 01:58
Ответ принят как подходящий

Чтобы проверить, содержат ли все объекты для одного и того же ключа одно и то же значение, вы можете использовать деструктурирующее задание для получения первого элемента и проверки по фактическому элементу.

var array = [{ a: 1, b: 2, c: 3, d: 4 }, { a: 1, x: 2, y: 3, z: 4 }],
    key = 'a';

console.log(array.every((a, _, [b]) => a[key] === b[key]));

Взять подстроку для сравнения

var array = [{ a: 12345, b: 2, c: 3, d: 4 }, { a: 12367, x: 2, y: 3, z: 4 }];

console.log(array.every((a, _, [b]) => a.a.toString().slice(0, 3) === b.a.toString().slice(0, 3)));

ES5

var array = [{ a: 12345, b: 2, c: 3, d: 4 }, { a: 12367, x: 2, y: 3, z: 4 }];

console.log(array.every(function (a, _, b) {
    return a.a.toString().slice(0, 3) === b[0].a.toString().slice(0, 3);
}));

Я действительно хочу вернуть истину, если значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:24

Большое спасибо! Это работает. Как я могу проверить, совпадают ли первые три символа «а» и возвращаются ли они? скажем, если массив похож на этот var array = [{a: 12345, b: 2, c: 3, d: 4}, {a: 12367, x: 2, y: 3, z: 4}]

Chris Jake 13.09.2018 23:06

какие персонажи вы имеете в виду?

Nina Scholz 13.09.2018 23:10

var array = [{a: 12345, b: 2, c: 3, d: 4}, {a: 12367, x: 2, y: 3, z: 4}] Здесь есть a: 12345 и a: 12367, поскольку первые три числа совпадают (например, 123), он должен вернуть истину.

Chris Jake 13.09.2018 23:16

Это прекрасно, но можете ли вы сделать это в ES5?

Chris Jake 14.09.2018 20:01

Я бы просто использовал Array.prototype.every(), чтобы проверить, все ли объекты имеют a как 1.

var arr = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}, {a:1, x:2, y:3, z:4}];
let result = arr.every((obj)=> obj.a === 1);
console.log(result);//true

arr = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}, {a:2, x:2, y:3, z:4}];
result = arr.every((obj)=> obj.a === 1);
console.log(result);//false

//Checks whether all the a keys is same in the array of objects.
result = arr.every((obj)=> obj.a === arr[0].a);
console.log(result); //false

arr = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}, {a:1, x:2, y:3, z:4}];
result = arr.every((obj)=> obj.a === arr[0].a);
console.log(result); //true

Я действительно хочу вернуть истину, если значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:24

Вы получите логическое значение от Array.prototype.every(), которое можете вернуть.

Fullstack Guy 13.09.2018 22:25

Значение «а» может быть не совсем «1». Я хочу вернуть истину после проверки того, что значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:29

Вы можете попробовать это: arr.every(obj => obj.a === arr[0].a); здесь. Я проверяю значение первого a и сравниваю его с остальными объектами. Если любое из значений a отличается, он вернет false. Если все значения a одинаковы, то он должен совпадать с первым элементом.

Fullstack Guy 13.09.2018 22:41

Похоже, вы могли бы использовать для этого Array.prototype.every ().

Он позволяет запускать тестовую функцию для каждого элемента в массиве и возвращать истину, если каждый элемент в массиве проходит успешно, и возвращать ложь в противном случае.

Обновлено: если вы хотите проверить, что все объекты имеют свойство a и все значения равны, вы можете сделать следующее:

const x = [{a:1, b:2, c:3, d:4}, {a:1, x:2, y:3, z:4}, {a:2, g:33, f:100}];
let condition = x.every( elem => elem.a == x[0].a);

Вы также можете использовать Array.prototype.some (), чтобы вернуть истину или ложь, если кто угодно элементов проходит проверку.

Вот рабочий пример, который показывает случай

Я действительно хочу вернуть истину, если значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:24

Значение «а» может быть не совсем «1». Я хочу вернуть истину после проверки того, что значение 'a' одинаково для всех объектов в массиве

Chris Jake 13.09.2018 22:34

Вы можете установить значение атрибута a первого объекта для переменной и использовать каждый, как указано выше, для проверки на соответствие переменной.

jdavison 13.09.2018 22:38

Отредактировал ответ, чтобы отразить это изменение.

jdavison 13.09.2018 22:46

Другие вопросы по теме