找出多个数组中的差异。使用减少
finding the difference in multiple arrays. using reduce
我正在尝试使用 reduce 重新创建下划线 js 函数差异。
差异接受多个数组和 returns 所有与第一个数组相似的值。所以 [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]));
我知道我调用 forEach 的方式不同,但这是因为我自己的 forEach 版本接受两个参数。
这是一个解决方案:
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'数组使用javascriptreduce
方法,使第一个数组成为累加器的默认值,用第一个数组过滤并拼接结果到你的累加器。
希望对您有所帮助,
最好的问候
可以试试这个
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]));
至于你的,你需要在数组上调用数组方法,而不是将它们作为参数传递,所以
return reduce(first,function(acc,cur){...})
但是
return first.reduce(function(acc,cur){...});
在你的函数中:
var first=arrayed[0];
var rest=arrayed.slice(1);
可使用拼接一步替换:
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]));
我正在尝试使用 reduce 重新创建下划线 js 函数差异。 差异接受多个数组和 returns 所有与第一个数组相似的值。所以 [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]));
我知道我调用 forEach 的方式不同,但这是因为我自己的 forEach 版本接受两个参数。
这是一个解决方案:
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'数组使用javascriptreduce
方法,使第一个数组成为累加器的默认值,用第一个数组过滤并拼接结果到你的累加器。
希望对您有所帮助,
最好的问候
可以试试这个
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]));
至于你的
return reduce(first,function(acc,cur){...})
但是
return first.reduce(function(acc,cur){...});
在你的函数中:
var first=arrayed[0];
var rest=arrayed.slice(1);
可使用拼接一步替换:
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]));