gpt4 book ai didi

javascript - 如何保留两个或多个数组中存在的项目并返回该数组?

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

所以我试图编写一个函数,仅当项目出现在两个或多个数组中时,该函数才会保留两个或多个数组中存在的项目。

E.g.,
a = ["Amy", "Sheldon", "Raj"]
b = ["Amy", "Penny", "Leonard"]
c = ["Amy", "Penny", "Howard"]

结果应该是 ["Amy", "Penny"],因为它们出现了 2 次或更多。

现在,我有一个方法可以针对每个数组并与其他每个数组进行比较,这是非常慢的。我正在合并多个数组,每个数组最多可能有 10000 个对象。

有什么建议吗?

最佳答案

您可以迭代数组并创建一个值对象以及它们出现的次数,然后迭代结果以收集出现两次或多次的值,例如

var a = ["Amy", "Sheldon", "Raj", "Raj"]
var b = ["Amy", "Penny", "Leonard"]
var c = ["Amy", "Penny", "Howard"]

// Create object of value:count
var counts = [a,b,c].reduce(function(acc, arr) {

// Remove duplicates from array
arr = arr.filter(function(value, i){
return arr.indexOf(value) == i;
});

// Add to and increment accumulator
arr.forEach(function(value) {
acc[value] = (acc[value] || 0) + 1;
});
return acc;
},Object.create(null));

// Create array of value where count > 1
var result = Object.keys(counts).filter(function(key){
return counts[key] > 1;
});

console.log(result); // Amy, Penny
// Raj not included as only in 1 array

如果您可以依赖对现代功能的支持,那么以下内容可能适合:

var a = ["Amy", "Sheldon", "Raj"];
var b = ["Amy", "Penny", "Leonard"];
var c = ["Amy", "Penny", "Howard"];


var counts = [a, b, c].reduce((acc, arr) => {
arr.filter(function(value, i){
return arr.indexOf(value) == i;
}).forEach(value => acc[value] = (acc[value] || 0) + 1);
return acc;
}, Object.create(null));

var result = Object.keys(counts).filter(key => counts[key] > 1);

console.log(result);

请注意,这可能不会保留顺序。如果您需要保证订单,请使用 Map而不是 counts 的对象,因为它将保持插入顺序。

使用 Object.create(null) 意味着累加器没有属性,从而无需进行 hasOwnProperty 测试:

acc[value] = (acc[value] || 0) + 1;

关于javascript - 如何保留两个或多个数组中存在的项目并返回该数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42336471/

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