我正在尝试使用reduce重新创建下划线js函数差异。 差异采用多个数组并返回与第一个数组类似的所有值。所以[1,2],[2,3],[1,3]应该吐出[1,2,2,1]。
我正在考虑循环遍历每个子数组(rest),如果我的子元素的值在我的第一个数组中有一个索引,那么我会将该元素推送到我的累加器值(这是一个空数组)。
某些原因我没有得到我想要的预期输出[1,2,3,2,1,2]。 相反,我得到[[1,2],[2,4],[1,2]]。任何人都可以使用reduce重写这个重写。谢谢。
function difference(arrays){
var arrayed=Array.prototype.slice.call(arguments);
var first=arrayed[0];
var rest=arrayed.slice(1);
return reduce(first,function(acc,cur){
forEach(rest,function(sub){
if (sub.indexOf(cur)>-1){
acc.push(sub);
}});
return acc;
},[]);
}
console.log(difference([1,2,3],[2,4],[1,2],[4,5]));
我知道im调用forEach的方式不同但是因为我自己的forEach版本接受了两个参数。
答案 0 :(得分:1)
这是一个解决方案:
function difference(arrays){
var arrayed = Array.prototype.slice.call(arguments);
var first = arrayed.splice(0,1)[0]; // edit, thanks robG
var tmp = [];
return arrayed.reduce(function(acc, arr) {
return acc.concat(arr.filter(function(el) {
return first.includes(el);
}));
}, first);
}
console.log(difference([1,2,3],[2,4],[1,2],[4,5]));
在'rest'数组上使用javascript reduce
方法,使第一个数组成为累加器的默认值,使用第一个数组过滤数组并将结果连接到累加器。
希望它有所帮助,
最好的问候
答案 1 :(得分:1)
可以试试这个
function difference(arrays){
var arrayed=Array.prototype.slice.call(arguments);
var first=arrayed[0];
var rest=arrayed.slice(1);
return first.concat(rest.reduce(function(acc, cur, curIndex, array){
first.forEach(function(eachEle){
if(cur.indexOf(eachEle) > -1 )
acc.push(cur[cur.indexOf(eachEle)]);
});
return acc;
}, []));
}
console.log(difference([1,2,3],[2,4],[1,2],[4,5]));
答案 2 :(得分:1)
对于你的previous question,你需要在数组上调用数组方法,而不是将它们作为参数传递,所以不能
return reduce(first,function(acc,cur){...})
但
return first.reduce(function(acc,cur){...});
在你的功能中:
var first=arrayed[0];
var rest=arrayed.slice(1);
可以使用splice替换为一步:
var first = arrayed.splice(0, 1)
并使用 arrayed 代替 rest 。但无论如何也没有必要。如果没有提供累加器,则使用第一个值,因此(对某些变量进行重命名):
function difference(){
var args = Array.prototype.slice.call(arguments);
return args.reduce(function(acc, cur){
cur.forEach(function(value){
if (acc.includes(value)){
acc.push(value);
}
});
return acc;
});
}
console.log(difference([1,2,3],[2,4],[1,2],[4,5]));