【问题标题】:How to check if an array contains all the elements of another another array如何检查一个数组是否包含另一个数组的所有元素
【发布时间】:2021-06-04 17:40:48
【问题描述】:

我有两个数组我需要检查 Array(A) 是否包含 Array(B) 的所有元素,但是 Array(A) 可以有比 Array(B) 更多的元素我已经尝试使用下面的代码,但它是没有按预期工作。

下面是我的代码

let ArrayA = [{headerName:'No'},{headerName:'zahid'},{headerName:'hussain'}];
let ArrayB = [{headerName:'zahid'},{headerName:'abass'},{headerName:'hussain'}];

checkArrayElements() {
    let value: boolean;
    this.ArrayA.map((element) => {
        value =
            this.ArrayB.find(
                (field: any) => field.headerName == element.headerName
            ) != null;
    });
    return value;
}

谁能告诉我哪里出错了?

【问题讨论】:

标签: javascript arrays typescript


【解决方案1】:

您当前方法的主要问题是您正在为.map() 的每次迭代重新设置value(旁注:这应该是.forEach() 而不是.map(),因为您没有使用返回的结果.map() - 更多信息here)。您目前只检查ArrayA 中最后一个元素的值是否出现在ArrayB 中,因为您没有考虑value 上的先前值是什么。相反,您可以对数组 B 进行外循环,然后使用内循环检查数组 B 中的值是否出现在 A 中。

话虽如此,我想我会使用 Set,您可以在其中合并两个数组元素并使用 Set 删除重复项。如果 B 中的所有元素都出现在 ArrayA 中,则 Set 的大小应该等于 ArrayA 的大小:

const ArrayA = [{headerName:'No'},{headerName:'zahid'},{headerName:'hussain'}];
const ArrayB = [{headerName:'zahid'},{headerName:'abass'},{headerName:'hussain'}];

const allInBAppearInA = new Set([...ArrayA, ...ArrayB].map(({headerName}) => headerName)).size === ArrayA.length;
console.log(allInBAppearInA);

如果我要使用如上所述的循环方法,我会使用 .every() 来检查 ArrayB 中的 每个 元素是否可以在 ArrayA 中找到(您可以使用 .some() 来检查 ArrayA 是否包含一个对象,该对象的给定标题名称与来自ArrayA 的标题名称匹配):

const ArrayA = [{headerName:'No'},{headerName:'zahid'},{headerName:'hussain'}];
const ArrayB = [{headerName:'zahid'},{headerName:'abass'},{headerName:'hussain'}];

const res = ArrayB.every(({headerName}) => ArrayA.some(obj => obj.headerName === headerName));
console.log(res);

【讨论】:

    【解决方案2】:

    使用过滤器(简化选项)

    const value =
          this.ArrayB.filter(f => this.ArrayA.map(m => m.headerName).includes(f.headerName)).length === this.ArrayB.length;
        console.log(value);
    

    【讨论】:

      【解决方案3】:

      你可以像这样得到两个数组之间的差异:

      let arrayA = [
          { headerName: "No" },
          { headerName: "zahid" },
          { headerName: "hussain" },
        ];
        let arrayB = [
          { headerName: "zahid" },
          { headerName: "abass" },
          { headerName: "hussain" },
        ];
      
        let firstArray = [];
        let secondArray = [];
        let diffrence = [];
        arrayA.map((objects) => {
          Object.keys(objects).map((key) => firstArray.push(objects[key]));
        });
        arrayB.map((objects) => {
          Object.keys(objects).map((key) => secondArray.push(objects[key]));
        });
      
        firstArray.map((element) => {
          if (!secondArray.includes(element)) {
            diffrence.push(element);
          }
        });
        secondArray.map((element) => {
          if (!firstArray.includes(element)) {
            diffrence.push(element);
          }
        });
      
        console.log(diffrence);
      

      【讨论】:

        【解决方案4】:

        可以解决这个简单的实现:

        let ArrayA = [{headerName: 'No'}, {headerName: 'zahid'}, {headerName: 'hussain'}];
        let ArrayB = [{headerName: 'zahid'}, {headerName: 'abass'}, {headerName: 'hussain'}];
        
        let checkArrayElements = () => {
          let allPresent = true;
          for (let i = 0; i < ArrayB.length; i++) {
        
            allPresent = ArrayA.map(a => a.headerName).indexOf(ArrayB[i].headerName) !== -1;
            if (!allPresent)
              break;
          }
          return allPresent;
        };
        console.log(checkArrayElements());

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-05
          • 2016-11-16
          • 2022-01-09
          • 2021-12-30
          相关资源
          最近更新 更多