diff --git a/lodash.src.js b/lodash.src.js index b58c4a38a..830b4acc4 100644 --- a/lodash.src.js +++ b/lodash.src.js @@ -5310,17 +5310,32 @@ function remove(array, predicate, thisArg) { var index = -1, length = array ? array.length : 0, - result = []; + result = [], + removes = 0, + indexes = [], + last; predicate = getCallback(predicate, thisArg, 3); while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { + if (last && last[0] + last[1] === index) { + ++last[1]; + } else { + last = [index - removes, 1]; + indexes.push(last); + } result.push(value); - splice.call(array, index--, 1); - length--; + ++removes; } } + + index = -1; + length = indexes.length; + while (++index < length) { + last = indexes[index]; + splice.call(array, last[0], last[1]); + } return result; } diff --git a/test/test.js b/test/test.js index 7f7abff6a..cc18395e3 100644 --- a/test/test.js +++ b/test/test.js @@ -12417,6 +12417,13 @@ _.remove(array, function(num) { return num == null; }); deepEqual(array, [1, 3]); }); + + test('should not mutate the array until all elements to remove are determined', 1, function() { + var array = [1, 2, 3]; + + _.remove(array, function(num, i) { return i % 2 == 0; }); + deepEqual(array, [2]); + }); }()); /*--------------------------------------------------------------------------*/