将数组的值与对象数组的键进行比较

时间:2018-04-06 16:29:58

标签: javascript arrays

正如问题所示,我需要将此类型[1,2,3]数组的值与对象数组[{id: 1, name: 'jhon'}, {id: 2 , name: 'max'}]的键值进行比较,在这种情况下,我想比较它使用id键的值,我写下我需要的示例:

如果我有这个对象数组:

[
   {
      id: 1
      name: 'jhon'
   },
   {
     id: 2,
     name: 'max'
   },
   {
     id: 3,
     name: 'fer'
   }
]

我有这个数组:

[1,2,3,4,5]

我需要比较它们并获取对象数组中不存在的值,在前面的示例中,值4和5不存在于对象数组中,因此我需要获取一个新数组或者同样,但是值不是[4,5]

注意:如果我有一个数组,只有不存在的数字,例如[8,9],它也应该有用,它们应该返回相同的值。

编辑:可以在新数组中获取仅存在于对象数组中的值。例如,使用前面代码的数组:

[{id: 1, name: 'jhon'}, {id: 2, name: 'max'}, {id: 3, name: 'fer'}]

现在这个数组将具有以下值[1,4,5]以及之前的答案我得到以下数组[4,5]什么是正确的。如何在新数组中获取值[2,3]

5 个答案:

答案 0 :(得分:2)

使用Setarr1的ID中创建Array.map()。然后filter arr2检查是否设置has数字:



const arr1 = [{"id":1,"name":"jhon"},{"id":2,"name":"max"},{"id":3,"name":"fer"}];
const arr2 = [1,2,3,4,5];
const arr3 = [1, 5];

const difference = (arr1, arr2, key) => {
  const arr1Values = new Set(key ? arr1.map(({ [key]: v }) => v) : arr1);

  return arr2.filter((n) => !arr1Values.has(n));
};

// array of primitives and array of objects
console.log(difference(arr1, arr2, 'id'));

// two arrays of primitives 
console.log(difference(arr3, arr2));




答案 1 :(得分:2)

您可以使用filterfind

let arr1 = [{id: 1,name: 'jhon'},{id: 2,name: 'max'},{id: 3,name: 'fer'}]
let arr2 = [1, 2, 3, 4, 5];

let result = arr2.filter(o => !arr1.find(x => x.id === o));

console.log(result);

更新:这基本上与第一个示例相反。您过滤arr2并检查arr1上是否存在该ID。然后,使用map返回id

let arr1 = [{id: 1,name: 'jhon'},{id: 2,name: 'max'},{id: 3,name: 'fer'}]
let arr2 = [1,4,5];

let result = arr1.filter(o => !arr2.find(x => x === o.id)).map(o=>o.id);

console.log(result);

文档:filter()find()

答案 2 :(得分:2)

您可以使用过滤器来检查arr2中元素的id属性是否与arr2中的当前元素匹配

const arr1 = [{"id":1,"name":"jhon"},{"id":2,"name":"max"},{"id":3,"name":"fer"}];

const arr2 = [8,9];
var diffArray = arr2.filter(x => !arr1.filter(y => y.id === x).length);
console.log(diffArray);

<强>答案 [8,9]

答案 3 :(得分:1)

您可以使用.filter().includes()

let arr1 = [{id: 1,name: 'jhon'},{id: 2, name: 'max'},{id: 3,name: 'fer'}],
    arr2 = [1, 2, 3, 4, 5];

let result = (
    ids => arr2.filter(n => !ids.includes(n))
)(arr1.map(({id}) => id));

console.log(result);

说明

  • 使用.map()从第一个数组中仅提取ID来创建新数组。
  • 使用.filter().includes()过滤元素,仅过滤新创建的数组中不存在的第二个数组的元素。

<强>文档:

答案 4 :(得分:1)

您可以使用给定的ID获取一个集合,然后删除该对象的集合。稍后使用剩余的ID返回数组。

var data = [{ id: 1, name: 'jhon' }, { id: 2, name: 'max' }, { id: 3, name: 'fer' }],
    ids = [1, 2, 3, 4, 5],
    result = Array.from(data.reduce((s, { id }) => (s.delete(id), s), new Set(ids)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }