[4,null,6] 和 [4,6] 有什么区别
What is the difference between [4,null,6] and [4,6]
这里是问题:
Compare two arrays and return a new array with any items only found in one of the two given arrays, but not both. In other words, return the symmetric difference of the two arrays.
这是我的代码:
function diffArray(arr1, arr2) {
var newArr = [];
// Same, same; but different.
for (i = 0; i < arr1.length; i++) {
for (j = 0; j < arr2.length; j++)
while (arr1[i] === arr2[j])
delete arr2[j];
newArr = arr2;
}
return newArr;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
请告诉我我的错误。
您尝试完成的任务要求您创建一个新数组,但您却修改了 arr2
。将不包含在另一个数组中的所有元素复制到一个新数组可能是最简单的,如下所示:
function diffArray(arr1, arr2) {
var newArray = [];
arr1.forEach(function(el) {
if (!arr2.includes(el)) {
newArray.push(el);
}
});
arr2.forEach(function(el) {
if (!arr1.includes(el)) {
newArray.push(el);
}
});
return newArray;
}
如果您更愿意尝试修复您的代码,我可以尝试再看一遍。
我用过Array.prototype.filter
方法:
function diffArray(arr1, arr2) {
var dif01 = arr1.filter(function (t) {
return arr2.indexOf(t) === -1;
});
var dif02 = arr2.filter(function (t) {
return arr1.indexOf(t) === -1;
});
return (dif01).concat(dif02);
}
alert(diffArray([1, 2, 3, 6, 5], [1, 2, 3, 4, 7, 5]));
如果您仍然想使用您的代码并删除公共元素,请尝试使用 Array.prototype.splice
方法而不是 delete
:后者删除值,但保持索引为空,而 Array.prototype.splice
将删除给定范围内的所有索引,并将重新索引该范围旁边的项目。
试试这个:
function diffArray(arr1, arr2) {
var ret = [];
function checkElem(arrFrom, arrIn) {
for (var i = 0; i < arrFrom.length; ++i) {
var elem = arrFrom[i];
if (arrIn.indexOf(elem) === -1)
ret.push(elem);
}
}
checkElem(arr1, arr2);
checkElem(arr2, arr1);
return ret;
}
希望能解决您的问题
如果您使用索引作为您删除的参考,您将保留这些索引 undefined
。
您必须使用 push
添加一项,使用 splice
删除一项。
以下代码的时间复杂度应该是: O(nm)
其中 n
和 m
分别是 arr1
和 arr2
数组的长度。
function diffArray(arr1, arr2) {
var newArr = [];
for (i = 0; i < arr1.length; i++) {
for (j = 0; j < arr2.length; j++)
while (arr1[i] === arr2[j])
arr2.splice(j, 1);
newArr = arr2;
}
return newArr;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
这应该可行,但我发现了一种不同的方法,它对于短数组来说有点慢,但对于长数组来说要快得多。
下面代码的时间复杂度应该是:O(3(n + m))
,减少到O(n + m)
其中n
和m
是arr1
和[=的长度19=] 数组分别。
看看这个fiddle。
这是它:
function diffArray(arr1, arr2) {
let obj1 = {}, obj2 = {};
for (let l = arr1.length, i = 0; i < l; i++)
obj1[arr1[i]] = undefined;
for (let l = arr2.length, i = 0; i < l; i++)
obj2[arr2[i]] = undefined;
let a = [];
for (let arr = arr1.concat(arr2), l = arr.length, i = 0, item = arr[0]; i < l; i++, item = arr[i])
if (item in obj1 !== item in obj2)
a.push(item);
return a;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
您可以使用 Array.prototype.filter
:
var array1 = [1, 2, 3, 5];
var array2 = [1, 2, 3, 4, 5];
var filteredArray = filter(array1, array2).concat(filter(array2, array1));
function filter(arr1, arr2) {
return arr1.filter(function(el) { return arr2.indexOf(el) < 0; });
}
Here 是一个有效的 JSFiddle。
这里是问题:
Compare two arrays and return a new array with any items only found in one of the two given arrays, but not both. In other words, return the symmetric difference of the two arrays.
这是我的代码:
function diffArray(arr1, arr2) {
var newArr = [];
// Same, same; but different.
for (i = 0; i < arr1.length; i++) {
for (j = 0; j < arr2.length; j++)
while (arr1[i] === arr2[j])
delete arr2[j];
newArr = arr2;
}
return newArr;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
请告诉我我的错误。
您尝试完成的任务要求您创建一个新数组,但您却修改了 arr2
。将不包含在另一个数组中的所有元素复制到一个新数组可能是最简单的,如下所示:
function diffArray(arr1, arr2) {
var newArray = [];
arr1.forEach(function(el) {
if (!arr2.includes(el)) {
newArray.push(el);
}
});
arr2.forEach(function(el) {
if (!arr1.includes(el)) {
newArray.push(el);
}
});
return newArray;
}
如果您更愿意尝试修复您的代码,我可以尝试再看一遍。
我用过Array.prototype.filter
方法:
function diffArray(arr1, arr2) {
var dif01 = arr1.filter(function (t) {
return arr2.indexOf(t) === -1;
});
var dif02 = arr2.filter(function (t) {
return arr1.indexOf(t) === -1;
});
return (dif01).concat(dif02);
}
alert(diffArray([1, 2, 3, 6, 5], [1, 2, 3, 4, 7, 5]));
如果您仍然想使用您的代码并删除公共元素,请尝试使用 Array.prototype.splice
方法而不是 delete
:后者删除值,但保持索引为空,而 Array.prototype.splice
将删除给定范围内的所有索引,并将重新索引该范围旁边的项目。
试试这个:
function diffArray(arr1, arr2) {
var ret = [];
function checkElem(arrFrom, arrIn) {
for (var i = 0; i < arrFrom.length; ++i) {
var elem = arrFrom[i];
if (arrIn.indexOf(elem) === -1)
ret.push(elem);
}
}
checkElem(arr1, arr2);
checkElem(arr2, arr1);
return ret;
}
希望能解决您的问题
如果您使用索引作为您删除的参考,您将保留这些索引 undefined
。
您必须使用 push
添加一项,使用 splice
删除一项。
以下代码的时间复杂度应该是: O(nm)
其中 n
和 m
分别是 arr1
和 arr2
数组的长度。
function diffArray(arr1, arr2) {
var newArr = [];
for (i = 0; i < arr1.length; i++) {
for (j = 0; j < arr2.length; j++)
while (arr1[i] === arr2[j])
arr2.splice(j, 1);
newArr = arr2;
}
return newArr;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
这应该可行,但我发现了一种不同的方法,它对于短数组来说有点慢,但对于长数组来说要快得多。
下面代码的时间复杂度应该是:O(3(n + m))
,减少到O(n + m)
其中n
和m
是arr1
和[=的长度19=] 数组分别。
看看这个fiddle。
这是它:
function diffArray(arr1, arr2) {
let obj1 = {}, obj2 = {};
for (let l = arr1.length, i = 0; i < l; i++)
obj1[arr1[i]] = undefined;
for (let l = arr2.length, i = 0; i < l; i++)
obj2[arr2[i]] = undefined;
let a = [];
for (let arr = arr1.concat(arr2), l = arr.length, i = 0, item = arr[0]; i < l; i++, item = arr[i])
if (item in obj1 !== item in obj2)
a.push(item);
return a;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
您可以使用 Array.prototype.filter
:
var array1 = [1, 2, 3, 5];
var array2 = [1, 2, 3, 4, 5];
var filteredArray = filter(array1, array2).concat(filter(array2, array1));
function filter(arr1, arr2) {
return arr1.filter(function(el) { return arr2.indexOf(el) < 0; });
}
Here 是一个有效的 JSFiddle。