如何获得具有不同属性比较器的两个对象数组之间的差异?

时间:2019-01-22 15:07:56

标签: javascript

我有以下两个数组:

主要:

[
   { id: "1"},
   { id: "2"},
   { id: "3"}
]

已过滤:

[
   { id: "80", link_id: "1"},
   { id: "50", link_id: null},
   { id: "67", link_id: "3"}
]

我需要获取main项,其ID为filtered中包含的项,其属性为:link_id,我尝试过:

main.filter(x => filtered.includes(x.id));

问题在于,该函数将返回null,并且这也不允许我检查link_id是否为空

var main = [{
      id: "1"
    },
    {
      id: "2"
    },
    {
      id: "3"
    }
  ],
  filtered = [{
      id: "80",
      link_id: "1"
    },
    {
      id: "50",
      link_id: null
    },
    {
      id: "67",
      link_id: "3"
    }
  ],
  result = main.filter(x =>
    filtered.includes(x.id)
  );

console.log(result)

2 个答案:

答案 0 :(得分:9)

尝试使用some()方法

var main = [
   { id: "1"},
   { id: "2"},
   { id: "3"}
]


var filtered = [
   { id: "80", link_id: "1"},
   { id: "50", link_id: null},
   { id: "67", link_id: "3"}
]


console.log(main.filter(x => filtered.some(item => item.link_id === x.id) ));

答案 1 :(得分:0)

您很亲密,基本上您需要检入filtered数组的每个项目。 includes对于普通对象来说更像documentation states.

检查下面的代码段,可以使用findIndexfindsome来获取元素是否存在于过滤后的数组中。

const main = [{
    id: "1"
  },
  {
    id: "2"
  },
  {
    id: "3"
  }
]
const filtered = [{
    id: "80",
    link_id: "1"
  },
  {
    id: "50",
    link_id: null
  },
  {
    id: "67",
    link_id: "3"
  }
]

const resultFindIndex = main.filter(item => -1 !== filtered.findIndex(filteredItem => item.id === filteredItem.link_id))

const resultFind = main.filter(item => filtered.find(filteredItem => item.id === filteredItem.link_id))

const resultSome = main.filter(item => filtered.some(filteredItem => item.id === filteredItem.link_id))

console.log(resultFindIndex)
console.log(resultFind)
console.log(resultSome)