【问题标题】:Check if each item in an array is identical in JavaScript检查数组中的每个项目在 JavaScript 中是否相同
【发布时间】:2012-03-10 13:48:10
【问题描述】:

我需要测试数组中的每个项目是否彼此相同。例如:

var list = ["l","r","b"]

应该评估为false,因为每个项目都不相同。另一方面:

var list = ["b", "b", "b"]

应该评估为true,因为它们都是相同的。实现这一目标的最有效(速度/资源)方式是什么?

【问题讨论】:

标签: javascript arrays


【解决方案1】:
function identical(array) {
    for(var i = 0; i < array.length - 1; i++) {
        if(array[i] !== array[i+1]) {
            return false;
        }
    }
    return true;
}

【讨论】:

  • 我选择了这个解决方案,谢谢。 Pimvdb 有一个非常优雅的 array.every 解决方案,但这需要为一个已经很大的文档添加一大块代码(用于不符合 ES5 的浏览器支持),只需要一个 .every 实例,所以我选择了这个。
  • 您的解决方案对我来说最有意义。但是,我会将 "!=" 更改为 "!==" 因为您的解决方案在以下数组 [1,1,1,1,1,1,"1"] 中返回 true,其中最后一个字符是字符串.
  • 我希望看到类似的东西,但对象除外。
  • 传统方式的好解决方案。 ES5 引入了 Array.every(),它可以用于一种线性解决方案:stackoverflow.com/questions/9646943/…
【解决方案2】:

在 ES5 中,你可以这样做:

arr.every(function(v, i, a) {
   // first item: nothing to compare with (and, single element arrays should return true)
   // otherwise:  compare current value to previous value
   return i === 0 || v === a[i - 1];
});

.every 也会短路。

【讨论】:

  • 很好,不知道这个存在,我自己开始使用它。只需为 array.ever 添加一个指向文档的指针 developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
  • 谢谢,这是一个非常优雅的解决方案。我最终选择了 Dogberts 解决方案以避免添加 array.every 代码来支持旧浏览器 - 但原则上这会很好地工作。
  • 这里不需要将每个前任与当前值进行比较,即 v===a[i-1]。无论如何,您可以在以下位置找到一个线性解决方案:stackoverflow.com/a/54826946/8958729
【解决方案3】:

你总是可以做一个新的集合,然后检查长度。

var set1 = [...new Set(list)].length === 1;

【讨论】:

    【解决方案4】:

    单行答案是:

    arr.every((val, ind, arr) => val === arr[0]);
    

    您可以查看Array.every了解更多详情。

    注意:

    1. Array.every 可在 ES5 以后使用。
    2. 此方法返回true 用于放置在空数组上的任何条件。
    3. 语法:arr.every(callback[, thisArg])array.every(function(currentValue, index, arr), thisValue)
    4. 不会改变原来的数组
    5. every() 的执行是short-circuited。一旦every() 发现一个与谓词不匹配的数组元素,它会立即返回 false 并且不会遍历剩余元素

    【讨论】:

      【解决方案5】:
      function matchList(list) {
        var listItem = list[0];
      
        for (index in list) {
          if(list[index] != listItem {
             return false;
          }
        }
      
        return true;
      }
      

      【讨论】:

      • 它将在数组的最后一个元素处失败。
      【解决方案6】:
      arr.every(i=>i==arr[0]) //will return true if all items in arr are identical
      

      【讨论】:

        【解决方案7】:
        var list = ["b", "b", "b"];
        var checkItem = list[0];
        var isSame = true;
        for (var i = 0; i < list.length; i++) {
          if (list[i] != checkItem) {
            isSame = false;
            break;
          }
        }
        return isSame;
        

        【讨论】:

        • 第一次遇到就返回false。
        • 是的,我不确定 OP 是希望它以后使用,还是在函数中返回。
        • 您可以使用every() 获得一个线性解决方案。参考:stackoverflow.com/a/54826946/8958729
        【解决方案8】:

        function identical(array) {
          // a variable holding standard value
          //against this standard value we are examining the array
          var standard = array[1];
          for (var i = 0; i < array.length; i++) {
            if (array[i] !== standard) {
              return false;
            }
          }
          return true;
        }
        
        identical([1, 1, 1, 1, 1]); //return true
        identical(['a', 'a', 'a']); //return true
        identical(['a', 'a', 'b'])

        function identical(array) {
          // a variable holding standard value
          //against this standard value we are examining the array
          var standard = array[1];
          for (var i = 0; i < array.length; i++) {
            if (array[i] !== standard) {
              return false;
            }
          }
          return true;
        }
        
        identical([1, 1, 1, 1, 1]); //return true
        identical(['a', 'a', 'a']); //return true
        identical(['a', 'a', 'b'])

        【讨论】:

          【解决方案9】:

          我的建议是删除重复项(查看 Easiest way to find duplicate values in a JavaScript array),然后检查长度是否 == 1。这意味着所有项目都相同。

          【讨论】:

          • 这将是 O(n^2) (或 O(n log n) 取决于排序算法)。太慢了。
          • 我实际上是在建议第二个答案(应该指定),即删除重复项而不进行排序。
          【解决方案10】:
          function allEqual(list)
          {
              if(list.length == 0 || list.length == 1)
              {
                return true;
              }
          
              for (index in list) {
              if(list[index] != list[index+1] {
                 return false;
              }
            }
          
            return true;
          
          }
          

          【讨论】:

          • 就像我的第一个答案:它将在数组的最后一个元素处失败。
          猜你喜欢
          • 2014-12-06
          • 2015-07-05
          • 2019-08-20
          • 1970-01-01
          • 2018-11-04
          • 2020-02-18
          • 1970-01-01
          • 2020-08-10
          • 1970-01-01
          相关资源
          最近更新 更多