【问题标题】:How can I find the index of an object inside a Array using underscore.js?如何使用 underscore.js 在 Array 中找到对象的索引?
【发布时间】:2014-02-26 15:23:55
【问题描述】:

我想使用 underscore.js 获取数组中给定值的索引。

这是我的情况

var array = [{'id': 1, 'name': 'xxx'},
             {'id': 2, 'name': 'yyy'},
             {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'};

我使用了以下代码,

var index = _.indexOf(array, function(data) { 
                alert(data.toSource()); //For testing purpose 
                return data === searchValue; 
            });

这个也试过了

var index = _.indexOf(array, {id: searchValue.id});

但它returns -1 。因为它没有进入那个功能。所以我没有收到那个警报信息。

我的代码有什么问题。 谁能帮我?

【问题讨论】:

    标签: javascript angularjs underscore.js javascript-framework


    【解决方案1】:

    对于对象,=== 和 == 检查两个引用是否引用了 相同 对象;它不检查 等效 对象:

    var a = {foo: "bar"};
    var b = {foo: "bar"};
    console.log(a === b); // false, `a` and `b` refer to different (but equivalent) objects
    a = b = {something: "here"};
    console.log(a === b); // true, `a` and `b` refer to the *same* object
    

    您必须测试对象的属性才能做出决定。在您的情况下,id 属性看起来是一个不错的选择,或者如果您想比较所有属性,您可以使用 Underscore 的 isEqual。

    【讨论】:

      【解决方案2】:

      改用这个:

      var array = [{'id': 1, 'name': 'xxx'},
                   {'id': 2, 'name': 'yyy'},
                   {'id': 3, 'name': 'zzz'}];
      
      var searchValue = {'id': 1, 'name': 'xxx'},
          index = -1;
      
      _.each(array, function(data, idx) { 
         if (_.isEqual(data, searchValue)) {
            index = idx;
            return;
         }
      });
      
      console.log(index); //0
      

      在您的 sn-p data === searchValue 比较对象的引用时,您不想这样做。另一方面,如果您使用data == searchValue,您将比较对象的字符串表示,即[Object object],如果您没有重新定义toString 方法。

      所以比较对象的正确方法是使用_.isEqual。

      【讨论】:

      • @T.J.Crowder 是的,同意。修正了我的答案。
      • 您可能想查看isEqual 的使用方式。 :-)
      【解决方案3】:

      也许我的建议会给你建议。

      为什么你在 indexof 方法中使用回调? underscore.js中indexof的签名如下:

      _.indexOf(array, value, [isSorted]) 
      

      find 可能更适合这项任务:

      _.find(array, function(item, index) {
        if (item.id == searchValue.id) {
          alert(index);
        }
      });
      

      【讨论】:

      • 有趣。那里缺少下划线的文档,因为它们没有解释谓词的参数是什么(它们只显示带有值的示例)。
      【解决方案4】:

      如果可用,下划线使用本机 indexOf 方法,否则应用回退。因此,对于对象列表,您必须以其他方式实现它。

      一个例子可以是

      _.chain(array).pluck("key").indexOf("value").value();
      

      或

      _.map(array,function(e) { return e.key; }).indexOf(value);
      

      【讨论】:

        【解决方案5】:

        我强烈建议看看 lodash。它包含很多漂亮的小功能,不幸的是缺少下划线。

        例如,这就是你对 lodash 所做的:

        var array = [{'id': 1, 'name': 'xxx'},
                   {'id': 2, 'name': 'yyy'},
                   {'id': 3, 'name': 'zzz'}];
        
        var searchValue = {'id': 1, 'name': 'xxx'};
        
        
        var index = _.findIndex(array, searchValue); 
        console.log(index === 0); //-> true
        

        http://lodash.com/docs#findIndex

        此外,如果您一定要使用 Underscore - 您可以在 https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js 获取 lodash 的下划线版本


        ES2015

        随着 ES2015 现在被广泛使用(通过像 Babel 这样的编译器),你可以放弃 lodash 和 underscore 来处理手头的任务并使用本地方法:

        var arr = [{ id: 1 }, { id: 2}];
        
        arr.findIndex(i => i.id === 1); // 0
        

        【讨论】:

          【解决方案6】:
          _.find(array, function(item, index) {
            if (item.id == searchValue.id) {
              alert(index);
            }
          });
          

          【讨论】:

            【解决方案7】:

            如果您有复杂的对象,并且想在集合中搜索一个对象以查找某个属性,请使用:

             _.indexOf(arrayObj, _.findWhere(arrayObj, {id: 1})  );
            

            其中“arrayObj”是包含对象的集合,“id”是道具,“1”是正在搜索的值。

            【讨论】:

              【解决方案8】:

              我正在使用查找索引

               _.findIndex(array, searchValue); 
              

              【讨论】:

                猜你喜欢
                • 2012-02-23
                • 1970-01-01
                • 1970-01-01
                • 2012-05-12
                • 2014-05-18
                • 1970-01-01
                • 2021-11-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多