使用数组方法根据另一个具有相同 id 的数组元素的存在来设置数组元素对象属性

问题描述 投票:0回答:1

标题很啰嗦,所以我将通过一个示例和工作代码来演示这个想法:

考虑商店中有一个大型歌曲库。我们称之为“bigarray”。客户拥有他/她自己的从该商店购买的歌曲的个人库:“smallArray”。 BigArray 元素具有“购买”属性。如果两个数组的歌曲之间的 id 匹配,我需要将该属性设置为“true”。一个工作代码示例:

for (let i = 0; i < bigArray.length; i++) {
  for (let j = 0; j < smallArray.length; j++) {
    if (bigArray[i].id === smallArray[j].id) {
      bigArray[i].purchased = true;
    }
  }
}

有没有一种方法可以使用数组方法(如映射、过滤器等)进行编程,并在一行中使用谓词函数,而不是使用双 for 循环?

javascript arrays methods
1个回答
2
投票

您可以首先从

smallArray
中的对象创建一组 id,然后在
.map()
上使用
bigArray
purchased
属性更新为
true
false
,具体取决于该集合是否具有大数组中当前对象的 id:

const smallSet = new Set(smallArray.map(({id}) => id));
const result = bigArray.map(obj => ({...obj, purchased: smallSet.has(obj.id)}));

您还可以使用

.some()
来确定您的
smallArray
是否有一个与您的
bigArray
中的 id 匹配的对象,与使用 O(n*k) 的集合相比,这具有更糟糕的 O(n*k) 时间复杂度(n+k),但如果您想要的是“一行”,则更适合:

const result = bigArray.map(obj => ({
  ...obj, 
  purchased: smallArray.some(item => item.id === obj.id)
}));
© www.soinside.com 2019 - 2024. All rights reserved.