【问题标题】:Checking values of one array against another in JS在JS中检查一个数组的值与另一个数组的值
【发布时间】:2020-05-19 12:17:24
【问题描述】:

我正在尝试检查第一个数组是否包含与第二个数组相同的值。 但是我对我的代码感到困惑。

第一个问题是:如果第一个数组中的所有字母都包含在第二个数组中,为什么我的代码会运行 else 语句?它将运行 2 行“这无效”

第二个问题是:如果我的第一个数组包含重复的字母,它仍然会通过检查,例如 [“a”,“b”,“a”,“d”,“e”,“f”];即使第一个有两个 a,它也会再次看到相同的“a”。任何人都知道解决此问题的方法。

很抱歉我的冗长问题,但我希望这是有道理的。谢谢:)

var letters = ["a", "b" , "c", "d", "e", "f"];
var otherLetters = ["a","b", "c" , "d", "e", "f"];

var i = -1;

while(i<=letters.length){



i++;
    if(otherLetters.includes(letters[i])){
        console.log("This is valid");
    }

    else 

    console.log("This is not valid");



}

【问题讨论】:

    标签: javascript arrays include


    【解决方案1】:

    你没有关闭括号。而且您的循环非常混乱,请使用foreach。这是一个工作示例:

    const letters = ["a", "b" , "c", "d", "e", "f"];
    const otherLetters = ["a","b", "c" , "d", "e", "f"];
    
    letters.forEach(el => {
      if (otherLetters.includes(el)) {
        console.log(el + 'is valid');
      } else {
        console.log(el + 'is not valid');
      }
    });
    

    【讨论】:

    • 谢谢 Nico,我现在觉得很傻哈哈。感谢您的回答能够修复我的代码:)
    【解决方案2】:

    您正在尝试访问超出范围的数组元素。该脚本在一个包含 6 个元素的数组上运行 8 次迭代。

    【讨论】:

    • 谢谢 Matthias,现在整理好了 :)
    【解决方案3】:

    首先,您设置了 i = -1,这令人困惑,因为数组的起始位置为 0。 您的循环额外运行两次的原因是因为循环从 -1 而不是 0 开始,接下来是条件 i

    由于 [array length = last index + 1] 您的循环额外运行了两次。 只是为了让您的代码工作分配 var i = 0 和 while 条件 i

    【讨论】:

      【解决方案4】:

      最简单的解决方案是使用lodash。它具有开箱即用的所有优化:

      var letters = ["a", "b" , "c", "d", "e", "f"];
      var otherLetters = ["f", "a","b", "c" , "d", "e"];
      
      const finalLetters = _.sortBy(letters);
      const finalOtherLetters = _.sortBy(otherLetters);
      
      if (_.isEqual(finalLetters, finalOtherLetters)) {
        console.log('Two arrays are equal.');
      } else {
        console.log('Two arrays are not equal.');
      }
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"&gt;&lt;/script&gt;

      【讨论】:

        【解决方案5】:

        数组是基于索引的,从 0 开始。因此,-1 和小于 letters.length 的检查会使代码超出范围。

        var letters = ["a", "b" , "c", "d", "e", "f"];
        var otherLetters = ["a","b", "c" , "d", "e", "f"];
        var i = 0;
        while(i<letters.length)
        {
            if(otherLetters.includes(letters[i]))
            {
                console.log("This is valid");
            }
            else
            {
                console.log("This is not valid");
            }
            i++;
        }
        

        【讨论】:

        • 感谢阿布舍克!我不知道为什么我决定从 -1 tbh 开始。我想我的大脑被炸了哈哈。
        【解决方案6】:

        您可以结合使用Array.prototype.everyArray.prototype.includes,以及一些额外的保护子句。

        const areSequenceEqual = (arr1, arr2) => {
          if (!arr1 || !arr2) {
            return false;
          }
        
          if (arr1.length !== arr2.length) {
            return false;
          }
        
          return arr1.every(x => arr2.includes(x));
        };
        
        const letters = ["a", "b", "c", "d", "e", "f"];
        const otherLetters = ["a", "b", "c", "d", "e", "f"];
        const someOtherLetters = ["a", "b", "c", "d", "e", "f", "g"];
        
        console.log(areSequenceEqual(letters, otherLetters));
        console.log(areSequenceEqual(letters, undefined));
        console.log(areSequenceEqual(letters, someOtherLetters));

        【讨论】:

        • 感谢 Kunal,我能够使用 include 方法解决我的问题 :)
        【解决方案7】:

        不用担心,cpog90。

        试试这个解决方案。

            var letters = ["a", "b" , "c", "d", "e", "f"];
            var otherLetters = ["a","b", "c" , "d", "e", "f"];
            
            var i = 0;
            while(i<letters.length){
                if(otherLetters.includes(letters[i])){
                    console.log("This is valid");
                }
                else {
                   console.log("This is not valid "+i);
                }
                i++;
            }

        你的逻辑出了什么问题?

        如果你声明i = -1 and while(i

        对于第一次迭代 (i = -1),'while' 条件返回 true 并检查 'a'

        输出:这是有效的

        对于第二次迭代 (i = 0),'while' 条件返回 true 并检查 'b'

        输出:这是有效的

        对于第三次迭代 (i = 1),'while' 条件返回 true 并检查 'c'

        输出:这是有效的

        对于第四次迭代 (i = 2),'while' 条件返回 true 并检查 'd'

        输出:这是有效的

        对于第五次迭代 (i = 3),'while' 条件返回 true 并检查 'e'

        输出:这是有效的

        对于第六次迭代 (i = 4),'while' 条件返回 true 并检查 'f'

        输出:这是有效的

        对于第七次迭代 (i = 5),'while' 条件返回 true 并检查未定义的值。

        输出:这是无效的

        对于第八次迭代 (i = 6),'while' 条件返回 true 并检查未定义的值。

        输出:这是无效的

        【讨论】:

        • 感谢您的明确解释 What If!再次,我不知道为什么我认为我会从 -1 开始,哈哈。能够修复我的代码:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        相关资源
        最近更新 更多