目的
我试图强调两个数组之间的差异。请注意,arr1和arr2的长度会有所不同,并且有多种类型(字符串和数字)。
我的代码
function diff(arr1, arr2) {
var diffArr = [];
if (arr1.length >= arr2.length) {
for (var i = 0; i < arr1.length; i++){
if (arr2.indexOf(arr1[i]) < 0) {
diffArr.push(arr1[i]);
}
}
} else {
for (var j = 0; j < arr2.length; j++){
if (arr1.indexOf(arr2[j]) < 0) {
diffArr.push(arr2[j]);
}
}
}
return diffArr;
}
问题
diff([1, 2, 'cat', 'fish'], [1, 2, 3,'dog']); //returns only ['cat', 'fish']
我很确定我的代码只通过diffArr.push返回其中一个数组中的重复项(即使两个数组中都有唯一值)。但是,我不确定如何克服这个问题。
我的推荐
Removes Duplicates from Javascript Arrays
答案 0 :(得分:2)
您的代码目前只抓取一个数组(让我们称之为A)并推送B中不存在的所有A值。您永远不会走另一条路并推入B中不存在的值答:根据哪个数组更长,也不需要有不同的行为。以下简单的方式给出了最终答案:
function diff(arr1, arr2) {
var diffArr = [];
for (var i = 0; i < arr1.length; i++) {
if (arr2.indexOf(arr1[i]) < 0) diffArr.push(arr1[i]);
}
for (var j = 0; j < arr2.length; j++) {
if (arr1.indexOf(arr2[j]) < 0) diffArr.push(arr2[j]);
}
return diffArr;
}
以稍微更具功能性的方式:
function diff(arr1, arr2) {
var elsIn1Not2 = arr1.filter(function(el){ return arr2.indexOf(el) < 0; });
var elsIn2Not1 = arr2.filter(function(el){ return arr1.indexOf(el) < 0; });
return elsIn1Not2.concat(elsIn2Not1);
}
两个函数都为您的示例返回[ 'cat', 'fish', 3, 'dog' ]
。
答案 1 :(得分:0)
function diff(arr1, arr2) {
var diffArr = {};
if (arr1.length >= arr2.length) {
for (var i = 0; i < arr1.length; i++){
if (arr2.indexOf(arr1[i]) < 0) {
diffArr[arr1[i]] = 1;
}
}
} else {
for (var j = 0; j < arr2.length; j++){
if (arr1.indexOf(arr2[j]) < 0) {
diffArr[arr2[j]] = 2;
}
}
}
return diffArr.keys();
}