Как сравнить значение свойства в нескольких объектах массива? - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

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

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

EDIT: если вы хотите проверить этовсе объекты имеют свойство 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 () , чтобы вернуть true или false, если любой из элементов проходит проверку.

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

0 голосов
/ 13 сентября 2018

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

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);
}));
0 голосов
/ 13 сентября 2018

Я бы просто использовал 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
0 голосов
/ 13 сентября 2018

Я бы использовал 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, если элемент не найден.

...