【问题标题】:Using lodash to check whether an array has duplicate values使用lodash检查数组是否有重复值
【发布时间】:2015-02-11 17:51:06
【问题描述】:

你们都认为使用 lodash 实用程序编写函数以检查数组中是否存在重复值的最佳方式(最好可以解释为最具可读性或最高性能,由您选择)。

我想输入['foo', 'foo', 'bar'] 并让函数返回true。然后输入['foo', 'bar', 'baz'],让函数返回false

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    你可以试试这个代码:

    function hasDuplicates(a) {
      return _.uniq(a).length !== a.length; 
    }
    
    var a = [1,2,1,3,4,5];
    var b = [1,2,3,4,5,6];
    
    document.write(hasDuplicates(a), ',',hasDuplicates(b));
    <script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>

    【讨论】:

    • == vs === 有什么特别的原因吗?
    • 在这种特殊情况下无关紧要。我改为===。谢谢!
    • 当然,但是为了挑剔,OP 要求的是 hasDuplicates 函数,而不是 hasNoDuplicates
    • 更改为hasDuplicates()
    • 简短而准确。很棒
    【解决方案2】:

    从 ES6 开始,您可以简单地使用 Set,这样就变成了:

    let hasDuplicates = arr => new Set(arr).size != arr.length
    
    console.log(hasDuplicates([5,3,2,1,2,1,2,1]))
    console.log(hasDuplicates([1,2,3,4,5]))

    这在一定程度上否定了在这种特殊情况下使用 lodash。

    【讨论】:

      【解决方案3】:

      您可以检查数组中是否存在_.some 元素,该元素在数组中查找时不会返回其自己的位置。换句话说,至少有一个元素在数组中较早地匹配。

      function hasDuplicates(array) {
          return _.some(array, function(elt, index) { 
              return array.indexOf(elt) !== index; 
          });
      }
      

      也许这比_.uniq 解决方案更快,因为它会立即识别第一个重复元素,而无需计算整个唯一化数组。

      或者,取决于你的编码风格和对可读性的渴望,如果你想使用 ES6 箭头函数来简洁:

      var earlierMatch  = (elt, index, array) => array.indexOf(elt) !== index;
      var hasDuplicates = array => _.some(array, earlierMatch);
      

      【讨论】:

      • 很好地使用indexOf!!
      • Nit-pick: indexOf (O(n)) 在 some (O(n)) -> O(n2) 内。
      • 是的,这是一个用于检查重复项的 O(n^2) 算法。我不会称其为挑剔,更像是一个重大缺陷。
      【解决方案4】:

      嗯,总会有的。 lodash 的 _.uniq() 函数。该函数实际上返回一个仅包含唯一值的新数组,因此我相信检查数组的长度是否已更改将使您返回自己的“真”或“假”值。

      【讨论】:

        【解决方案5】:

        我不知道 lodash 但我提交:

        _.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });
        

        到目前为止提出的所有解决方案的问题是,整个输入数组都需要处理才能得到答案,即使答案从数组的前 2 个元素中显而易见。

        【讨论】:

        • 从 lodash 的第 4 版开始,_.any_.some 取代
        【解决方案6】:

        无需使用lodash,请使用以下代码:

        function getDuplicates(array, key) {
          return array.filter(e1=>{
            if(array.filter(e2=>{
              return e1[key] === e2[key];
            }).length > 1) {
              return e1;
            }
          })
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-08
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2017-12-11
          • 1970-01-01
          • 2011-03-09
          相关资源
          最近更新 更多