diff --git a/lodash.js b/lodash.js index 1d9e9ef4e..5645309b0 100644 --- a/lodash.js +++ b/lodash.js @@ -4400,18 +4400,25 @@ * @returns {Array} Returns the new array of values. */ function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } var index = -1, - length = arrays.length; + result = Array(length); while (++index < length) { - var result = result - ? arrayPush( - baseDifference(result, arrays[index], iteratee, comparator), - baseDifference(arrays[index], result, iteratee, comparator) - ) - : arrays[index]; + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + var othArray = arrays[othIndex]; + if (othArray !== array) { + result[index] = baseDifference(result[index] || array, othArray, iteratee, comparator); + } + } } - return (result && result.length) ? baseUniq(result, iteratee, comparator) : []; + return baseUniq(baseFlatten(result, 1), iteratee, comparator); } /** diff --git a/test/test.js b/test/test.js index 525d7c943..392ef0bc4 100644 --- a/test/test.js +++ b/test/test.js @@ -25264,7 +25264,7 @@ assert.expect(2); var actual = func([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]); - assert.deepEqual(actual, [1, 4, 5]); + assert.deepEqual(actual, [1, 4]); actual = func([1, 1]); assert.deepEqual(actual, [1]);