我想比较一个数组:
array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'bob'];
我想检测array2是否包含在array1中找不到的名称。
array2可以长于或短于array1,换句话说,array2可能缺少名称或名称比array1多,但是array2的名称不能与array1相比。
到目前为止,我可以检测到array2是否比数组1长。如果是,则显然是在添加名称,因此无效:
if (array1.length < array2.length) {
console.log('no');
}
但是我并没有达到所需的精确度(如果两个数组具有相等数量的值,即使各个值不相关,它也会返回true)。
请参阅以下示例场景:
array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'b', 'paul']; //should not be valid
array1 = ['billy', 'b', 'paul'];
array2 = ['billy', 'bob', 'paul']; //should not be valid
array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'paul']; //should not be valid
array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'bob', 'paul', 'michael']; //should not be valid
array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'bob']; //this is valid
array1 = ['billy', 'bob', 'paul'];
array2 = ['billy']; //this is valid
array1 = ['bob', 'bob', 'billy', 'paul'];
array2 = ['paul', 'bob', 'bob', 'bob']; //this IS NOT valid
array1 = ['bob', 'bob', 'billy', 'paul'];
array2 = ['paul', 'bob', 'bob']; //this is valid
我假设我应该使用.every(),但是我不确定在比较两个数组时如何实现它,因为所有示例我都将一个数组的测试值与单个值进行比较。
更新:数组2的特定名称实例不能多于数组1,但是可以更少。
答案 0 :(得分:3)
当至少一个名称不在some
中并且两个数组之间的名称总和不同时,该方法使用函数array1
停止。
let isValid = (arr, arr2) => {
let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);
return !arr2.some(n => {
let sum2 = sum(arr2, n);
return !arr.some(an => an === n && sum(arr, an) === sum2);
});
};
console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'b', 'paul'])); //should not be valid
console.log(isValid(['billy', 'b', 'paul'], ['billy', 'bob', 'paul'])); //should not be valid
console.log(isValid(['billy', 'bob', 'paul'],['billy', 'michael', 'paul'])); //should not be valid
console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'bob', 'paul', 'michael'])); //should not be valid
console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'bob'])); //this is valid
console.log(isValid(['billy', 'bob', 'paul'], ['billy'])); //this is valid
console.log(isValid(['bob', 'bob', 'billy', 'paul'], ['paul', 'bob', 'bob', 'bob'])); //this is NOT valid
console.log(isValid(['bob', 'bob', 'billy', 'paul'], ['paul', 'bob', 'bob'])); //this is valid
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:2)
您可以使用every
来检查array2
中的每个对象是否在array1
中:
var array1 = ['billy', 'bob', 'paul'];
var array2 = ['billy', 'michael', 'bob'];
var allFound = array2.every(e => array1
.includes(e));
console.log(allFound); //Should return false because 'michael' is not in array1
这也可以通过其他方式起作用:
var array1 = ['billy', 'bob', 'paul'];
var array2 = ['billy', 'michael', 'bob'];
var allFound = array1.every(e => array2.includes(e));
console.log(allFound); //Should return false because 'paul' is not in array2
如注释中所建议,您还可以将array1
(要检查的对象-请参见第一个示例)设为Set
,它类似于数组,但仅包含唯一值:
var array1 = ['billy', 'bob', 'paul'];
var array2 = ['billy', 'michael', 'bob'];
var array1Unique = new Set(array1);
var allFound = array2.every(e => array1Unique.has(e));
console.log(allFound); //Should return false because 'michael' is not in array1
答案 2 :(得分:1)
如果您想要一个简单易懂的解决方案,则无需使用每一个。只需使用下面的代码即可。
下面的代码使用.forEach()
循环遍历array2
,并使用另一个.forEach()
循环找出array2
中的值是否也位于{{1 }}。
注意:还有许多更有效的方法,但是如果您不熟悉编程并且想了解如何完成此方法,则更易于理解。
编辑:如您在注释中所建议,我已修复代码,因此array1
中的每个值在array2
中只有一个对应值。并非每次它与array1
和array2
中的值匹配时,都会从array1
中删除该值。
array1
答案 3 :(得分:0)
您可以使用简单的for循环和.includes()
来完成任务以下示例:
var array1 = ['billy', 'michael', 'paul'];
var array2 = ['billy', 'michael', 'bob'];
var check = true;
for(var i = 0; i < array2.length; i++){
if(!array1.includes(array2[i])){
check = false;
break;
}
}
console.log(check);