【问题标题】:Javascript indexOf on an array of objects对象数组上的 Javascript indexOf
【发布时间】:2012-01-08 22:41:33
【问题描述】:

如果我有一个类似的数组:

var myArray = [
                {
                    'color':'red',
                    'name': 'redName'
                },
                {
                    'color':'blue',
                    'name': 'blueName'
                },
                {
                    'color':'green',
                    'name': 'greenName'
                    },
                {
                    'color':'yellow',
                    'name': 'yellowName'
                },
             ];

如何获得“蓝色”的索引?

【问题讨论】:

    标签: javascript indexing


    【解决方案1】:

    就我而言,我构建了自己的函数,因为我希望循环在找到的第一个元素处停止。

    这就是为什么使用 map 的解决方案在创建新数组时无法解决这种情况。

      var i = 0;
      while (i < myArray.length) {
        if (myArray[i].color == 'blue') {
          return i;
        }
        i++
      }
      return -1
    

    【讨论】:

      【解决方案2】:
      for(var i = 0; i < myArray.length; i++) {
         if(myArray[i].color === 'blue') {
           return i;
         }
      }
      

      除非您想涉及第三方库,否则没有“干净”的方法。 Underscore 非常适合这类事情。

      【讨论】:

      • 此答案中的链接现在已损坏。
      • @AndersonGreen 已修复,谢谢!另外,这个答案很老了。我现在推荐 Lodash。 ES5 还为 Array 原型提供了原生 find() 实现。
      • 如果您可以为其添加 Lodash 功能会很棒
      【解决方案3】:

      您可以使用.findIndex() method

      你的情况

      var findeMe = "blue";
      myArray.findIndex(function(row){
      return row.color == findMe;
      });
      

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        我知道这已经很老了,但是 Javascript es6 有一个很棒的方法Array.prototype.findIndex(),所以你可以这样做:

        let index = myArray.findIndex((item) => item.color === 'blue');
        // value of index will be "1"
        

        【讨论】:

          【解决方案5】:

          如果您已经在代码中使用 ECMAScript 5,则可以使用它:

          myArray
              .map(function (element) {return element.color;})
              .indexOf('blue');
          

          请注意,对这些功能的支持非常有限(它们不适用于 Internet Explorer 8)。

          另外,如果你在未来,并且你正在使用 ES6,你可以这样做:

          myArray.map((el) => el.color).indexOf('blue');
          

          和上面一样,但是更小。

          【讨论】:

          • 这是一个优雅的解决方案
          • “如果你在未来”荣誉!
          • 上面有一个函数可以简化更多的代码:myArray.findIndex(el =&gt; el.color === 'blue');It's supported on many modern browsers
          【解决方案6】:

          例如这样:

          DEMO

          Array.prototype.objIndexOf = function(val) {
              var cnt =-1;
              for (var i=0, n=this.length;i<n;i++) {
                cnt++;
                for(var o in this[i]) {
                  if (this[i].hasOwnProperty(o) && this[i][o]==val) return cnt;
                }
              }
              return -1;
          }
          var myArray = [
                          {
                              'color':'red',
                              'name': 'redName'
                          },
                          {
                              'color':'blue',
                              'name': 'blueName'
                          },
                          {
                              'color':'green',
                              'name': 'greenName'
                              },
                          {
                              'color':'yellow',
                              'name': 'yellowName'
                          },
                       ];
              alert(myArray.objIndexOf('blue'))
          

          【讨论】:

          • 1 岁的答案,您不屑于投反对票。席子。 stackoverflow.com/questions/8859828/…对 MDN 来说已经足够好了,对我来说已经足够好了:developer.mozilla.org/en-US/docs/JavaScript/Reference/…
          • 哈哈我实际上并没有投反对票 =) 因为它已经是 0。1 年后,这个问题仍然与我正在寻找的东西相关。
          • 所以改为投票。这是一个很好的解决方案。或者你有更好的吗?我什至为你添加了 this[i].hasOwnProperty(o)
          【解决方案7】:

          我猜你的意思是从你的例子中返回“1”?这是给你的一个功能......

          <script type='text/javascript'>
          var myArray = [
                          {
                              'color':'red',
                              'name': 'redName'
                          },
                          {
                              'color':'blue',
                              'name': 'blueName'
                          },
                          {
                              'color':'green',
                              'name': 'greenName'
                              },
                          {
                              'color':'yellow',
                              'name': 'yellowName'
                          },
                       ];
          function getIndexOf(a,v) {
            var l = a.length;
            for (var k=0;k<l;k++) {
              if (a[k].color==v) {
                  return k;
                }
            }                      
            return false;
          }
          
          alert (getIndexOf(myArray,'blue'));
          </script>
          

          【讨论】:

            【解决方案8】:

            这不是一个多维数组(甚至不是一个锯齿状数组,它被用来代替 Javascript 中的多维数组,因为它们不存在)。那是一个对象数组。

            您可以循环遍历数组中的项目:

            var index;
            for (var i = 0; i < myArray.length; i++) {
              if (myArray[i].color == 'blue') {
                index = i;
                break;
              }
            }
            

            现在变量index 包含值1,与您给出的示例一样。

            【讨论】:

              【解决方案9】:

              遍历数组,寻找每个元素对象内的值。原始 JavaScript 并没有为您提供很多工作。

              【讨论】:

              • ...我认为多维数组没有 indexOf?
              • @redconservatory 嗯,这不是一个多维数组。但不,没有。您可以将大量实现添加到数组原型中,或者手动完成。
              • 没有。但我只是想确保你在这里有一些清楚的东西......看来你的问题是查找一个值的键,这就像 php 的 array_search()。但是“indexOf”更像是 php 的 strpos(),它查看一个字符串是否在另一个字符串中(并返回出现的位置)。
              猜你喜欢
              • 2015-04-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-02
              相关资源
              最近更新 更多