【问题标题】:Getting index of an array's element based on its properties根据属性获取数组元素的索引
【发布时间】:2012-09-15 05:15:05
【问题描述】:

我有一个这样的 JavaScript 对象数组:

var myArray = [{...}, {...}, {...}];

每个对象都有唯一的id 以及其他属性:

{ 
  id: 4,
  property1: 'something',
  property2: 'something'
}

如果我只知道它的id 属性,如何获得该数组中特定对象的索引?所以如果我知道myArray[x].id == 4,我怎么能找到x

【问题讨论】:

  • ES6 Array.findIndex - 查看下面的完整示例

标签: javascript arrays object


【解决方案1】:

或者使用 ES6 语法:

let index = myArray.map( el => el.id ).indexOf(4)

let index = myArray.findIndex( el => el.id === 4 )

【讨论】:

    【解决方案2】:

    ES6 Array.findIndex

    const myArray = [{id:1}, {id:2}, {id3}];
    const foundIndex = myArray.findIndex((el) => (el.id === 3));
    

    【讨论】:

      【解决方案3】:

      您可以使用.reduce(),它可以让您将数组缩减为单个值。

      var obj_idx = myArray.reduce(function(idx, item, i) {
        return item.id === 4 ? i : idx;
      }, -1);
      

      如果没有找到匹配项,-1 是默认值。


      如果您对此有多种用途,您可能需要创建一个函数工厂。

      function idxForID(target) {
          return function(idx, item, i) {
            return item.id === target ? i : idx;
          };
      }
      

      然后像这样使用它。

      var obj_idx = myArray.reduce(idxForID(4), -1);
      

      【讨论】:

        【解决方案4】:
        var index = myArray.map(function(el) {
          return el.id;
        }).indexOf(4);
        

        对于版本 9 以下的 IE,map 需要一个补丁,或者只是使用一个循环。

        【讨论】:

        • 这看起来最好,很好。没想到
        • Map 应该返回一个数组,所以这虽然有效,但让我感到困惑。对于每个不匹配的索引,map 的新返回数组中不应该有一个 -1 的元素吗?
        【解决方案5】:

        您也可以尝试递归函数,尽管 @xdazz 看起来很有吸引力。

        var indexOfId = function(arr, id, index) {
            if (!index) { index = 0; }
            if (arr[index].id == id) {
              return index;
            }
            return ((index += 1) >= arr.length) ? -1 : indexOfId(arr, id, index);
        };
        

        【讨论】:

          【解决方案6】:

          如果每个 id 都是唯一的,你可以这样做:

          o1 = {id:1}
          o2 = {id:2}
          o3 = {id:3}
          o4 = {id:4}
          a = [o1,o2,o3,o4]
          a.indexOf( a.filter( function(i){return i.id==4} )[0] );
          

          【讨论】:

            【解决方案7】:

            为什么不简单地做一个循环呢?

            function indexOfId(array, id) {
                for (var i=0; i<array.length; i++) {
                   if (array[i].id==id) return i;
                }
                return -1;
            }
            

            在 js(或 js 库)中有许多设施这一事实并不意味着您有时不必编写循环。这既快速又简单。

            【讨论】:

            • 也许你应该使用indexOf以外的其他东西
            • 这很可能会导致他代码的其他地方出现问题;也许indexOfId() 或其他什么?
            • @Nile: 不,indexOf 在这里不起作用——你需要filter
            • @Bergi 他的原始答案包含函数名称 indexOf 而不是 indexOfId
            猜你喜欢
            • 1970-01-01
            • 2021-05-13
            • 1970-01-01
            • 2016-09-03
            • 1970-01-01
            • 2021-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多