对于可能具有误导性的标题,我们深表歉意。
我有两个数组,一个包含默认值,另一个包含产品。
我想做的是比较两者,以便您可以根据需要添加/删除任意数量的产品,但不能减少默认产品。
让我们说
default = [1,2]
products = [1,1,1,1,2,2,2,3,4,5,6,7,8,9]
这应该有效。
但是你不能有这样的东西:
default = [1,2]
products = [2,2,2,3,4,5,6,7,8,9]
因为默认数组中至少需要相同数量的产品,而在最后一个示例中,1 不包含在产品数组中。
我用它来比较两个数组:
Array.prototype.containsArray = function ( array /*, index, last*/ ) {
if( arguments[1] ) {
var index = arguments[1], last = arguments[2];
} else {
var index = 0, last = 0; this.sort(); array.sort();
};
return index == array.length
|| ( last = this.indexOf( array[index], last ) ) > -1
&& this.containsArray( array, ++index, ++last );
};
arr1.containsArray( arr2 )
哪个有效。在我的函数(用于添加/删除产品的函数)中,我尝试进行这样的检查:
removeDeviceToZone = function(zone, ID) {
if (products.containsArray(default) {
return products = removeFromArray(products, ID);
}
};
但问题是,在执行检查时,数组仍然是正确的,但一旦删除一个产品,它就不再正确了。什么是最好的检查方法来防止在删除项目而不真正删除它之后数组将是什么?有可能吗?这是最好的方法吗?谢谢
最佳答案
您应该使用 every
函数,它接受应用于数组中每个项目的回调提供的方法。
The every() method tests whether all elements in the array pass the test implemented by the provided function.
function containsArray(defaultArray, products){
return defaultArray.every(function(item){
return products.indexOf(item)!=-1;
});
}
let defaultArray = [1,2]
let products = [1,1,1,1,2,2,2,3,4,5,6,7,8,9];
let products2=[2,2,2,3,4,5,6,7,8,9];
let contains=containsArray(defaultArray,products);
let contains2=containsArray(defaultArray,products2);
console.log(products.toString()+'->'+contains);
console.log(products2.toString()+'->'+contains2);
当您删除项目时,您应该检查 containsArray
是否保持为真。换句话说,您必须检查 containsArray
函数是否在删除元素后返回 true。如果是,则 return
产品。否则,返回
旧的products数组。
removeDeviceToZone = function(zone, ID) {
let productsCopy=products;
let products=removeFromArray(products, ID);
if (containsArray(default,products) && containsArray(default,productsCopy) {
return products;
}
else
return productsCopy;
};
关于Javascript - 如何检测两个数组的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45323250/