将一个数组与另一个数组进行比较,以确保第二个数组不包含其他值

时间:2019-02-27 00:42:21

标签: javascript arrays algorithm function ecmascript-6

我想比较一个数组:

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,但是可以更少。

4 个答案:

答案 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中只有一个对应值。并非每次它与array1array2中的值匹配时,都会从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);