合并两个地图对象并返回自定义对象javascript

时间:2018-06-05 00:21:58

标签: javascript arrays filter merge find

我有两个数组

let a1 = [{id: 1, name: "terror"}, {id: 2, name: "comics"}, {id: 3, name: "suspense"}]
let a2 = [{id: 1, name: "terror"}, {id: 3, name: "suspense"}]

我需要将这些数组相互比较,并得出类似这样的结果:     [{id:1,名称:"恐怖",已选择:true},{id:2,名称:"漫画",已选择:false},{id:3,名称: "悬疑",已选择:true}]

我尝试使用下面的filter,但它没有用,我该怎么办?

a2.filter(data => {
  return a1.find(value => {
    let x = data.id === value.id ? {
      id: value.id,
      text: value.name,
      selected: true
    } : {
      id: data.id,
      text: data.name,
      selected: false
    }
  })
})

1 个答案:

答案 0 :(得分:1)

您不应该使用map因为您需要一个与您开始时具有相同数量的项目的输出数组 - 而是使用a2创建一个具有相同数量元素的新数组作为原始数组,只进行了转换。

由于看起来map没有任何新信息,并且只有通过显示某些对象的存在 abscence 才有用,复杂程度较低的是a2 Setid a1个,然后通过迭代id生成新对象并检查它们是否Set {1}}位于let a1 = [{id: 1, name: "terror"}, {id: 2, name: "comics"}, {id: 3, name: "suspense"}] let a2 = [{id: 1, name: "terror"}, {id: 3, name: "suspense"}] const a2IDs = new Set(a2.map(({ id }) => id)); const output = a1.map((item) => ({ ...item, selected: a2IDs.has(item.id) })); console.log(output);

.filter

可以修改您的代码以使其有效,将.map更改为.find并使用a2,但它会更复杂,因为它'每次必须迭代Set中的项目(通过比较O(1)查找JavaPairRDD<String, String> textFiles = sc.wholeTextFiles(PATH); )。