这里,我有两个不同长度的数组。一个数组将返回两个数组中不常见的值。但编译器输出错误。这些功能有哪些问题? 输出:[4,5]在这种情况下,而不是[4]。
function diffArray(arr1, arr2) {
var newArr = [];
var y=[];
var z=[];
// Same, same; but different.
var flag=0;
for(var i=0;i<arr1.length;i++){
if(arr2.indexOf(arr1[i]===-1)){
z=arr1.slice(i,i+1);
//return z;
}
for(var j=0;j<arr2.length;j++){
if(arr1.indexOf(arr2[j])===-1){
y=arr2.slice(j,j+1);
//z=arr1.slice(i,i+1);
//break;
}
}
}
return newArr.concat(y,z);
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
diffArray(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]);
答案 0 :(得分:1)
尝试以下方法:
function diffArray (arr1, arr2) {
var z = arr1.filter(function (value) { return !~arr2.indexOf(value); });
var y = arr2.filter(function (value) { return !~arr1.indexOf(value); });
return [].concat(y, z);
}
答案 1 :(得分:1)
您可以尝试替代您的功能
a1 = [1, 2, 3, 5];
a2 = [1, 2, 3, 4, 5];
result = [];
if (a1.length > a2.length) {
temp = a1;
a1 = a2;
a2 = temp;
}
$.grep(a2, function(k) {
if ($.inArray(k, a1) == -1) result.push(k);
});
console.log(result);,
这两个数组的工作都是jsfiddle。
试一试,这样可行。
答案 2 :(得分:1)
在您的代码中,您有以下行:
z=arr1.slice(i,i+1);
y=arr2.slice(j,j+1);
如果这样做,每次获得一个独特元素时,您将丢失之前存储的元素。
此外,Array.prototype.slice
会返回一个数组,因此您也不需要使用slice()
。
function diffArray(arr1, arr2) {
var newArr = [];
var y=[];
var z=[];
var flag=0;
for(var i=0;i<arr1.length;i++) {
if(arr2.indexOf(arr1[i])===-1) {
z.push(arr1[i]);
}
}
for(var j=0;j<arr2.length;j++) {
if(arr1.indexOf(arr2[j])===-1) {
y.push(arr2[j]);
}
}
return y.concat(z);
}
这应该可以帮助你。
这是一个显示相同的fiddle。
答案 3 :(得分:1)
function diffArray(arr1, arr2) {
var newArr = [];
var firstArray = arr1;
var secondArray = arr2;
if (arr2.length > arr1.length) {
firstArray = arr2;
secondArray = arr1;
}
var isNotMatched = false;
for (var i in firstArray) {
for (var j in secondArray) {
if (firstArray[i] !== secondArray[j]) {
isNotMatched = true;
} else {
isNotMatched = false;
break;
}
}
if (isNotMatched)
newArr.push(firstArray[i]);
}
return newArr;
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
第二版适用于所有
function diffArray(arr1, arr2) {
var newArr = [];
var firstArray = arr1;
var secondArray = arr2;
if (arr2.length > arr1.length) {
firstArray = arr2;
secondArray = arr1;
}
var whenSameLegth = '';
var isNotMatched = false;
for (var i in firstArray) {
for (var j in secondArray) {
if (firstArray[i] !== secondArray[j]) {
isNotMatched = true;
whenSameLegth = secondArray[j];
} else {
isNotMatched = false;
break;
}
}
if (isNotMatched && arr2.length === arr1.length) {
newArr.push(firstArray[i]);
newArr.push(whenSameLegth);
} else if (isNotMatched) {
newArr.push(firstArray[i]);
}
}
return newArr;
}
diffArray([“andesite”,“grass”,“dirt”,“pink wool”,“dead krub”],[“diorite”,“andesite”,“grass”,“dirt”,“dead krub” ]);
答案 4 :(得分:0)
编写的代码最多只能返回两个项目,因为只要y
或{{1},z
和z=arr1.slice(i,i+1);
都会被一个长度为1的新数组覆盖} 叫做。您可能想使用Array.push,即y=arr2.slice(j,j+1);
和z.push(arr1[i]);
。每次找到一个元素时,这将添加到同一个数组,而不是每次都重置结果数组。
答案 5 :(得分:0)
您可以合并数组并返回唯一值。
function diffArray(a1, a2){
var data = a1.concat(a2);
return data.filter(function(item, i, a){
return a.indexOf(item) === a.lastIndexOf(item)
});
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
console.log(diffArray([1, 2, 3, 5], [11, 12, 13, 14, 5]));
&#13;
答案 6 :(得分:0)
试试这个
var newArr = [];
function diffArray(arr1, arr2) {
arr1.forEach(function (item) {
if (arr2.indexOf(item) === -1)
newArr.push(item);
});
arr2.forEach(function (item) {
if (arr1.indexOf(item) === -1)
newArr.push(item);
});
}
diffArray(["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]);
答案 7 :(得分:0)
如果您可以使用最新版本的JavaScript(ES6),则以下操作应该以线性时间运行,而不是二次时间 - O(N)与O(N²)。
function diffArray(a, b) {
a = new Set(a)
let result = []
for (let value of b) {
a.delete(value) || result.push(value)
}
result.push(...a)
return result
}
console.log(diffArray(
[1, 2, 3, 5],
[1, 2, 3, 4, 5]
))
console.log(diffArray(
["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"],
["diorite", "andesite", "grass", "dirt", "dead shrub"]
))
答案 8 :(得分:0)
您可以使用哈希表并计算出现次数。它也适用于数组中的多个equla元素。
function getSymmetricDifference(a1, a2) {
var hash = {};
a1.forEach(function (a) {
(hash[a] = hash[a] || { count: 0, value: a }).count++;
});
a2.forEach(function (a) {
(hash[a] = hash[a] || { count: 0, value: a }).count--;
});
return Object.keys(hash).filter(function (a) { return hash[a].count; }).map(function (a) { return hash[a].value; });
}
console.log(getSymmetricDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));
console.log(getSymmetricDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]));
&#13;