【问题标题】:function to return index of an object in a deeply nested array返回深度嵌套数组中对象索引的函数
【发布时间】:2012-07-24 13:37:03
【问题描述】:

我可能需要编写一个函数来输出数组内对象的索引,显然,在下面的示例中使用 $.inArray 会很好地返回。

array = ['one', 'two', 'three'];

$.inArray('one', array) // 0

使用更精细的数组,如何找到嵌套在其中的对象的索引?

array = [
    {
        name: 'One', // index??
        data: {
            title: 'Title One',
            content: 'Content One'
        }
    },
    {
        name: 'Two',
        data: {
            title: 'Title Two',
            content: 'Content Two'
        }
    },
    {
        name: 'Three',
        data: {
            title: 'Title Three',
            content: 'Content Three'
        }
    }
];

我听说过 $.grep() 方法,indexOf() .. 不确定使用哪一个来返回对象所在索引的整数

【问题讨论】:

  • 这些函数都不处理多维数组。您必须推出自己的搜索功能。 indexof/grep 可以在数组的每一层使用,但是在层之间移动取决于你。

标签: javascript arrays indexing


【解决方案1】:

您不需要预先编写的函数,只需遍历您的数组并比较 name 属性:

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

【讨论】:

    【解决方案2】:

    您可以使用name 属性作为索引。

    试试这个代码:

    var indexOfObj = function(array,objName){
        var len = array.length;
        while(--len>=0 && array[len].name!==objName);
        return len;
    }
    

    如果在数组中找不到 obj,此函数将返回 -1

    【讨论】:

      【解决方案3】:

      没有内置函数.. 但很容易编写你自己的所有风格。作为练习,您还可以使用它们来扩展 jQuery,

      var array = [{
          name: 'One',
          // index??
          data: {
              title: 'Title One',
              content: 'Content One'
          }},
      {
          name: 'Two',
          data: {
              title: 'Title Two',
              content: 'Content Two'
          }},
      {
          name: 'Three',
          data: {
              title: 'Title Three',
              content: 'Content Three'
          }}];
      
      function findByName(name) {
          var index;
          $(array).each(function(i, e) {
              if (e.name && e.name == name) {
                  index = i;
                  return false;
              }
          });
          return index;
      }
      console.log(findByName("One")); // prints 0
      
      // and now even better ... find by any property
      
      
      function findByProperty(objects, prop, value) {
          var index;
          $(objects).each(function(i, e) {
              if (e[prop] && e[prop] == value) {
                  index = i;
                  return false;
              }
          });
          return index;
      }
      
      // usage
      var index = findByProperty(array, "name", "One");
      console.log(index); // prints 0
      index = findByProperty(array, "name", "Three");
      console.log(index); // prints 2
      // and even more powerful
      
      
      function findByFilter(objects, filter) {
          var index;
          $(objects).each(function(i, e) {
              if (filter(i, e)) {
                  index = i;
                  return false;
              }
          });
          return index;
      }
      
      index = findByFilter(array,function(i,e){ return e.data.title=="Title Two"; });
      console.log(index); // prints 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 2023-01-13
        • 2019-01-29
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多