2017-05-04 53 views
1

我想重新使用reduce重新創建下劃線js函數差異。 差異需要多個數組並返回類似於第一個數組的所有值。所以[1,2],[2,3],[1,3]應該吐出[1,2,2,1]。我想我的每個子數組(循環),如果我的子元素的值在我的第一個數組中有一個索引,然後我將該元素推到我的累加器值(這是一個空數組)。在多個數組中找到差異。使用減少

某些原因我沒有得到我期望的輸出結果[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

你的算法的解釋是不清楚。如果結果是第一個數組的值,那麼從後續數組中重複值? – RobG

回答

1

至於你previous question,你需要調用數組陣列的方法,而不是將它們作爲參數,所以不

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) 

,並使用擺着而不是休息。但無論如何,這並不需要。如果沒有提供蓄電池,那麼第一個值被使用,所以(有一些變量重命名):

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]));

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])); 

使用JavaScript reduce方法的「休息」陣列上,使得第一陣列是累加器的缺省值,與第一個和的concat結果篩選陣列到你的蓄電池。

希望它能幫助,
問候

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]));