我有一个函数可以删除javascript中两个数组之间的非公共元素,但是问题是我的代码减少了数组中的某些项目而增加了一些。下面是我的代码
function canFormPairs(cleanSocks, dirtySocks) {
let compared = [];
cleanSocks.forEach(item => {
dirtySocks.forEach(dItem => {
if (item == dItem) {
compared.push(item);
}
});
});
return compared;
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));
上面的代码给出
[ 1, 5, 5, 6, 6, 7, 7, 5, 5, 6, 6, 5, 5 ]
而不是预期的结果
[1, 1, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7]
排序时
请这段代码有什么问题
答案 0 :(得分:6)
您当前的逻辑会在两个数组之间的每个唯一索引匹配中推送该项目。例如,对于7,在索引3(第一个数组)和索引3(第二个数组)处匹配7,因此将其压入一次。然后,下一个匹配项是索引3(第一个数组)和索引7(第二个数组)。除了3-3
和3-7
之外,没有其他 index 匹配项,因此只有两个7
(值)被推送。
我会考虑从两个数组中创建一个Set
,然后合并两个数组并使用.filter
删除两个集合中都不存在的元素,然后对数组进行排序:
function canFormPairs(a, b) {
const setA = new Set(a);
const setB = new Set(b);
return [...a, ...b]
.filter(item => setA.has(item) && setB.has(item))
.sort((a, b) => a - b);
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));
答案 1 :(得分:0)
尝试
function canFormPairs(cleanSocks, dirtySocks) {
let compared = [];
let one = cleanSocks.filter(el => dirtySocks.includes(el));
let two = dirtySocks.filter(el => cleanSocks.includes(el));
compared = one.concat(two);
compared.sort(function(a, b) {
return a - b;
});
return compared;
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));
答案 2 :(得分:0)
让这个答案集中在为什么OP的代码给出不正确的结果。
您的算法读起来像
a
,b
a
上循环。b
上循环。a[i] === b[i]
,请按a[i]
作为结果。问题:
m*n
个项目。因此对于1
,由于两者都只有一次,因此您只有1次。同样,对于5
,它的2*3
则是6
次,而不是5
次。输出应为m+n instead
。答案 3 :(得分:0)
我对您的功能进行了一些更改,现在可以使用:
function canFormPairs(cleanSocks, dirtySocks) {
let compared = [];
let cleanSocksUniqueItems = [];
cleanSocks.map((item, index) => {
cleanSocks.slice(index+1).map(elem => {
if (item === elem && !cleanSocks.slice(0, index).includes(item)) {
dirtySocks = [...dirtySocks, elem];
}
});
});
cleanSocksUniqueItems = Array.from(new Set(cleanSocks));
cleanSocksUniqueItems.forEach(item => {
dirtySocks.forEach(dItem => {
if (item === dItem) {
if (!compared.includes(item)) {
compared = [...compared, item];
}
compared = [...compared, item];
}
});
});
return compared.sort();
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));
答案 4 :(得分:0)
这是使用.Sum(x => (int)x[CounterpartyFields.DEBT]);
的简单解决方案,请看一下。
flatMap