【问题标题】:Better solution to find a cell in an array在数组中查找单元格的更好解决方案
【发布时间】:2013-09-05 20:21:03
【问题描述】:

我有以下数组:

var myArray = [
        {
            "id":1,
            "name":"name1",
            "resource_uri":"/api/v1/product/1"
        },
        {
            "id":5,
            "name":"name2",
            "resource_uri":"/api/v1/product/5"
        }
]

每一行都由它的唯一 ID 标识。我对 Javascript 很陌生,想知道根据 id 查找单元格的最佳解决方案是什么。

例如对于id:5;我的函数必须返回:

findCell(myTable, id=5);
// this function must return:
{
     "id":5,
     "name":"name2",
     "resource_uri":"/api/v1/product/5"
}

我很害怕做一个丑陋的for循环......也许有一些内置的javascript函数可以执行这些基本操作。

谢谢。

【问题讨论】:

  • 是否需要在数组中?为什么不将 id 作为键存储在对象中?
  • 标题具有误导性。您正在按属性搜索数组中的对象。检查this answer。
  • 感谢@LucaFagioli,它的答案非常好,而且没有 Javascript。过滤器的解决方案对我来说不是最好的,因为我的 id 是独一无二的。遗憾的是,我无法更改输出并将 id 作为键,但这会容易得多。
  • @AlexGrs 你可以在运行中构建一个键 => 索引映射......

标签: javascript


【解决方案1】:

如果您要坚持使用数组,那么“丑陋”的 for 循环是您最好的兼容性选择。放到函数里面也没那么难看:

function findById(id) {
    for(var i = 0; i < myArray.length; ++i) {
        if(myArray[i].id === id) return myArray[i];
    }
}

// Not checking return value here!
alert(findById(5).name);

Filter 是另一种选择,如果您只关心最新版本的浏览器。它将返回一个值数组。

如果您的数组非常大,那么引入某种索引以进行高效查找是有意义的。它增加了额外的维护负担,但可以提高频繁查找的性能:

var index = {};
for(var i = 0; i < myArray.length; ++i) {
    index[myArray[i].id] = i;
}

// Find element with id=5
alert(myArray[index[5]].name);

Example

【讨论】:

    【解决方案2】:

    是的,有一个内置函数 - filter。我会这样使用它:

    findCells(table, property, value) {
       return table.filter(function (item) {
          return item[property] === value;
       });
    }
    
    findCells(myTable, "id", 5);
    

    这是你想要的稍微修改的版本:它可以通过指定的属性名称值找到所有单元格。

    编辑:使用for循环搜索第一次出现的元素是可以的,其实:

    findCell(table, id) {
       var result = null;
       for (var i = 0, cell = table[0], l = table.length; i < l; i++, cell = table[i]) {
          if (cell.id === id) {
             result = cell;
             break;
          }
       }
       return result;
    }
    
    findCell(myTable, 5);
    

    【讨论】:

    • 别忘了这会返回一个数组。如果属性是唯一的,您可能想要检查数组的长度并返回 null 或元素本身。
    • 过滤器功能是当您要过滤数组时。它将遍历所有值,当它找到您要搜索的内容时不会返回。
    • @LucaFagioli 正如我所说,它是一个稍微修改过的版本,可以通过作为参数传递的任何属性来查找任意数量的单元格。在我看来,它比简单地通过id 找到第一个元素更有用。
    • 一个 id 应该是唯一的,因此搜索两个或多个具有相同 id 的不同对象是错误的方法。
    • @LucaFagioli,先生,我的功能不一定是按 id 搜索。不过好吧,我会更新答案的。
    【解决方案3】:

    试试这个表达式,这可能会有所帮助

    var result = myArray.filter(function(element, index) { return element.ID == 5; });
    

    filter() 有两个参数

    元素 - 当前行

    index - 当前行索引。

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多