【问题标题】:Check if elements of one array are present in an other array - within a certain index检查一个数组的元素是否存在于另一个数组中 - 在某个索引内
【发布时间】:2021-04-10 19:28:07
【问题描述】:

我有 2 个数组:

arr1 = ['banana', 'apple', 'orange', 'tomato', 'grape']
arr2 = ['banana', 'grape']

我正在检查:

  • 如果 arr1 中存在 arr2 的元素
  • 但仅在 arr1 中的索引 0 和 2 之间

我正在尝试以下代码:

if (arr2.some(fruit => arr1.indexOf(fruit) >= 0) && arr2.some(fruit => arr1.indexOf(fruit) <= 2)) {
 //do something }

上面命名为 arr1 和 arr2 的代码应该返回 TRUE。使用以下替代数组 2,代码应返回 FALSE:

arr2 = ['tomato', 'grape'] //false 

我认为我处理可能索引范围的方式有问题。我尝试了几种替代方法,但没有任何效果。有谁知道我可以尝试什么?非常感谢!

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    检查some 方法中的两个条件。

    下面的代码只会检查arr2 中的任何元素是否在该范围内,如果您希望所有元素都在该范围内,请使用every 而不是some

    const arr1 = ["banana", "apple", "orange", "tomato", "grape"];
    const arr2 = ["banana", "grape"];
    
    if (arr2.some((fruit) => arr1.indexOf(fruit) > 0 && arr1.indexOf(fruit) <= 2)) {
      console.log("Yes");
    } else {
      console.log("No")
    }

    【讨论】:

    • 谢谢,这是最接近我的代码的答案,对我有用!
    【解决方案2】:

    您的描述看起来好像您想找出数组 2 的两个元素是否都在 0-2 范围内。在这种情况下,两个项目都必须为索引检查返回 true,因此检查将是 .every()。如果您真的在寻找单个项目,请使用 .some() 而不是 .every()。

    arr1 = ['banana', 'apple', 'orange', 'tomato', 'grape']
    arr2 = ['banana', 'grape']
    
    const lookUp = arr2.every(fruit =>{
        const index = arr1.indexOf(fruit);
        return index >= 0 && index <=2
    })
    
    console.log(lookUp)
    //false
    

    在任何情况下,您都不需要调用 .some()/.every() 和 .indexOf() 两次。

    【讨论】:

      【解决方案3】:

      您可以在arr1 子数组上从begend 索引创建一个set,然后为每个arr2 元素检查是否那一套有没有。

      const arr1 = ['banana', 'apple', 'orange', 'tomato', 'grape']
      const arr2 = ['banana', 'grape']
      
      function check(beg, end, arr1, arr2) {
        const arr1Set = new Set(arr1.slice(beg, end + 1));
        return arr2.every(ele => arr1Set.has(ele));
      }
      
      // returns false
      console.log(check(0, 2, arr1, arr2));
      // returns true
      console.log(check(0, 4, arr1, arr2));

      【讨论】:

        【解决方案4】:

        您可以尝试执行以下操作

        const checkIfSetIsASubsetOfAnotherSet = (listA, listB, range) => {
            const setA = listA.slice(range.start, range.stop);
            return listB.some(listItem => setA.includes(listItem));
        s};
        
        checkIfSetIsASubsetOfAnotherSet(
            ['banana', 'apple', 'orange', 'tomato', 'grape'], 
            ['banana', 'grape'], 
            { start: 0, stop: 2 }
        );
        

        【讨论】:

          【解决方案5】:

          你也可以使用过滤功能

          var arr1 = ['banana', 'apple', 'orange', 'tomato', 'grape']
          var arr2 = ['banana', 'grape']
          
          arr2 = arr1.slice(0,2).filter( ( x ) => arr2.indexOf( x ) !== -1 )
          
          console.log(arr2 = arr2.length > 0 ? arr2 : false)

          【讨论】:

            猜你喜欢
            • 2016-04-22
            • 1970-01-01
            • 1970-01-01
            • 2016-07-27
            • 1970-01-01
            • 2021-01-30
            • 2017-03-03
            • 1970-01-01
            • 2010-10-06
            相关资源
            最近更新 更多