javascript - 将一个数组与另一个数组进行比较,以确保第二个数组不包含不同的值

标签 javascript arrays algorithm function ecmascript-6

我想将一个数组与另一个数组进行比较:

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'bob'];

我想检测 array2 是否包含在 array1 中找不到的名称。

array2 可以比 array1 长或短,换句话说,array2 可能缺少名称或比 array1 具有更多名称,但 array2 不能与 array1 具有不同的名称。

到目前为止,我可以检测到数组 2 是否比数组 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,但可以更少。

最佳答案

此方法使用函数 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; }

关于javascript - 将一个数组与另一个数组进行比较,以确保第二个数组不包含不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896340/

相关文章:

javascript - React - 防止生命周期组件渲染相同的数据两次 : WillReceiveProps & componentDidMount

javascript - jQuery 每个都没有在父 li 的子 ul 中获取元素

javascript - 仅在滚动过去元素 javascript 后触发事件

c - 只有在循环中分配每个单独的元素时,数组的分配才会成功

java - 搜索字符串列表(100 000 个字符串): How to search for x character if there is a %

javascript - 按空格拆分字符串,忽略嵌套字符串中的空格

python - 从索引对创建倍数的元组

c - 从c中的const数组中删除重复项

查找 "ordered combinations"的算法

c++ - list.sort 和 std::sort 有什么区别?