gpt4 book ai didi

javascript - 如何使用java脚本过滤后避免两个数组中的重复对象

转载 作者:行者123 更新时间:2023-12-03 02:59:53 25 4
gpt4 key购买 nike

我有两个数组(busns和pc)我想检查pc数组 -> pcid与busns数组匹配 -> 匹配后的pcid我想返回pcname。最终输出即将到来,但我想避免重复。提前致谢

please check my attempt in jsfiddle

const busns = [
{
id:1,
shopname:'New trend',
pcid:1
},
{
id:2,
shopname:'Latest Beauty',
pcid:2
},
{
id:3,
shopname:'Mens Style',
pcid:1
},
{
id:4,
name:'Fabulook',
pcid: 1
},
{
id:4,
name:'New cut',
pcid: 2
}
]

const pc = [
{
pcid:1,
pcname: 'collection1'
},
{
pcid:2,
pcname: 'collection2'
},
{
pcid:3,
pcname: 'collection3'
},
{
pcid:4,
pcname: 'collection4'
}
]

我的代码:

busns.map(busns => {
return pc.filter( p => {
return busns.pcid == p.pcid
}).map(data => {
console.log(data.pcname)
})
})

使用控制台时的预期输出:

集合1

集合2

最佳答案

正如评论所述,您可以使用这个:

var ids = busns.map(x=>x.pcid); pc.filter(x=> ids.includes(x.pcid))

<小时/>

您的代码:

你正在做的是,

  • 循环业务数组以获取当前 PC ID。
  • 然后使用此 ID 从 PC 列表中过滤掉,然后使用 map 获取名称。

现在您的代码的问题是,由于您在 busns 数组上循环,因此您实际上是在为每个 id 打印 PC 的名称。

const busns = [{ id: 1, shopname: 'New trend', pcid: 1 }, { id: 2, shopname: 'Latest Beauty', pcid: 2 }, { id: 3, shopname: 'Mens Style', pcid: 1 }, { id: 4, name: 'Fabulook', pcid: 1 }, { id: 4, name: 'New cut', pcid: 2 } ]

const pc = [{ pcid: 1, pcname: 'collection1' }, { pcid: 2, pcname: 'collection2' }, { pcid: 3, pcname: 'collection3' }, { pcid: 4, pcname: 'collection4' } ]

busns.map(busns => {
return pc.filter(p => {
return busns.pcid == p.pcid
}).map(data => {
console.log(data.pcname)
})
})

<小时/>

评论中的解决方案:

您可以做的不是嵌套循环结构,

  • 创建 pcid 列表。这将帮助您了解电脑是否已被交易。
  • 循环pc数组。交易可以很多,但产品将是有限的且数量较少。使用它来获取 busns 中经过过滤的产品列表。
  • 现在循环遍历这个过滤后的数组并检索名称。这部分内容未在评论中提及。

const busns = [{ id: 1, shopname: 'New trend', pcid: 1 }, { id: 2, shopname: 'Latest Beauty', pcid: 2 }, { id: 3, shopname: 'Mens Style', pcid: 1 }, { id: 4, name: 'Fabulook', pcid: 1 }, { id: 4, name: 'New cut', pcid: 2 } ]

const pc = [{ pcid: 1, pcname: 'collection1' }, { pcid: 2, pcname: 'collection2' }, { pcid: 3, pcname: 'collection3' }, { pcid: 4, pcname: 'collection4' } ]

var ids = busns.map(x=>x.pcid);
var pcNames = pc
.filter(x=> ids.includes(x.pcid))
.map(x=> x.pcname);

console.log(pcNames)

<小时/>

首选解决方案:

上述方法的一个问题是列表中的额外迭代和重复的 pcid。因此,我们可以使用 .reduce 并创建唯一列表,而不是使用 .map + .filter 等函数。这将使迭代保持最少。

  • 创建一个 hashMap,键为 pcid,值为 true。这将创建一个唯一的 ID 映射。
  • 现在循环 pc 数组并检查当前 id 是否存在于该对象中。如果存在,请按名称。如果没有,请继续。

我建议您使用这种方法,因为这应该更高效。对于大型数组,使用 .map + .filter + .indexOf 可能会很昂贵。

const busns = [{ id: 1, shopname: 'New trend', pcid: 1 }, { id: 2, shopname: 'Latest Beauty', pcid: 2 }, { id: 3, shopname: 'Mens Style', pcid: 1 }, { id: 4, name: 'Fabulook', pcid: 1 }, { id: 4, name: 'New cut', pcid: 2 } ]

const pc = [{ pcid: 1, pcname: 'collection1' }, { pcid: 2, pcname: 'collection2' }, { pcid: 3, pcname: 'collection3' }, { pcid: 4, pcname: 'collection4' } ]

var ids = busns.reduce((acc, cur) => acc[cur.pcid] = true && acc, {});

var pcNames = pc.reduce((acc, cur) => {
if(ids[cur.pcid]) {
acc.push(cur.pcname);
}
return acc;
}, [])

console.log(pcNames)

关于javascript - 如何使用java脚本过滤后避免两个数组中的重复对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com