在数组中查找单元格的更好解决方案

Better solution to find a cell in an array

本文关键字:更好 解决方案 单元格 查找 数组      更新时间:2023-09-26

我有以下数组:

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"
}

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

谢谢。

是的,有一个内置函数-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);

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

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

filter()有两个参数

元素-当前行

index—当前行索引。

如果您要坚持使用数组,那么"丑陋"的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);

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

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

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);

示例