2016-06-14 5 views
0

私はerrorLogArrayList.lengthが3であることを期待していますが、結果は2"forEach"のこの使用で何が問題になっていますか?

このコードは動作しない理由を私は期待して、それを修正する方法として、誰も私に教えてもらえますか?

CODE:

var logArrayList = [ 
    [1,2,3], 
    [1,2,"error"], 
    [1,2,"error"], 
    [1,2,"error"] 
] 

var errorLogArrayList = []; 

console.log(logArrayList); 
console.log("======================"); 


logArrayList.forEach(function(logArray, index, self) { 

    if(logArray[2] === "error") { 

     var errorArray = self.splice(index, 1)[0]; 
     errorLogArrayList.push(errorArray); 

    } 

}); 

// I expect this value to be 3, but the result is 2. 
console.log("errorLogArrayList.length is " + errorLogArrayList.length) 

console.log(errorLogArrayList); 

console.log("======================"); 

// I expect this value to be 1, but the result is 2. 
console.log("logArrayList.length is " + logArrayList.length); 
console.log(logArrayList); 

LOG:

[ [ 1, 2, 3 ], 
    [ 1, 2, 'error' ], 
    [ 1, 2, 'error' ], 
    [ 1, 2, 'error' ] ] 
====================== 
// I expect this value to be 3, but the result is 2. 
errorLogArrayList.length is 2 
[ [ 1, 2, 'error' ], [ 1, 2, 'error' ] ] 
====================== 
//I expect this value to be 1, but the result is 2. 
logArrayList.length is 2 
[ [ 1, 2, 3 ], [ 1, 2, 'error' ] ] 
+3

反復処理中の配列は変更しないでください。 – zerkms

+0

@zerkmsそう、元の配列をクローンして残りの作業をするのですか? – hytm

+0

@zenkms同時に2つの配列ではなく、1つの配列のみを変更すると、配列を変更することはできますか? – hytm

答えて

3

あなたはfilter操作を単に行うことができます。

var errorLogArrayList = logArrayList.filter(function(array) { 
    return array[2] === 'error'; 
}); 

logArrayList = logArrayList.filter(function(array) { 
    return array[2] !== 'error'; 
}); 

は、残念ながら、これはいくつかのduplicatが必要ですイテレーション。あなたが(少しきれいに見える)したい場合は、_.partition from lodashを使用することができます。

var lists = _.partition(logArrayList, function(array) { 
    return array[2] === 'error'; 
}); 

var errorLogArrayList = lists[0]; 

logArrayList = lists[1]; 

をあなたの現在のアプローチの問題は、あなたが複数の状態を追跡し、同時に2つの配列を変更しようとしているということであり、これはデータの競合が発生する可能性があります。 filterは通常、宣言的なものですが、元の配列は変更されず、代わりに新しい配列が返されます。 partition例と同じし

var lists = logArrayList.reduce(function(agg, curr) { 
    if(curr[2] === 'error') { 
    agg[0] = (agg[0] || []).concat([curr]); 
    } else { 
    agg[1] = (agg[1] || []).concat([curr]); 
    } 

    return agg; 
}, []); 

をコメントに@zerkmsによって示唆されるよう

編集reduceとメソッドを追加したいです。

+1

...または 'Array.prototype.reduce' – zerkms

+0

@zerkms良いコール、それを例として追加します。おかげで –

+1

ありがとう!私は今それを試してみよう! – hytm

関連する問題