在嵌套数组/对象中查找对象的最快方法

时间:2018-02-06 19:04:39

标签: javascript arrays multidimensional-array

我有以下对象数组,它们在一个属性上也有一个数组:

const boards = [
  {
    id: 1,
    name: 'Lorem ipsum',
    tasks: [
      { id: 42, ... },
      { id: 65, ... },
      { id: 24, ... },
    ],
  },
  {
    id: 2,
    name: 'Lorem ipsum',
    tasks: [
      { id: 12, ... },
      { id: 85, ... },
      { id: 14, ... },
    ],
  },
];

我正在寻找最佳最有效方式来查找task的索引(当然还有其所在的董事会) 。我想出了以下内容,但我想知道这是否真的是寻找task时最有效的方式,特别是当你有一个大型数据集时,或者是否有更好的搜索方式?

在我的特殊情况下,不会有很多电路板(大部分时间不超过10个,但可能有数百个任务)

const idToFind = 1;

let boardIndex = null;
let taskIndex = null;

boards.some((board, index) => {
  taskIndex = board.tasks.findIndex(task => task.id === idToFind);

  // if it has found the task, assign board index and end lookup
  if (taskIndex > -1) {
    boardIndex = index;
    return true;
  }

  return false;
});

1 个答案:

答案 0 :(得分:1)

boards

中创建一个新的任务查找表及其相关索引
var taskIds = {
  12: 1,
  85: 1,
  14: 1,
  42: 0,
  65: 0,
  24: 0
};

从那里,找到一个任务和相关的董事会只有O(1) * 2

使用Lodash的示例:

var taskIds = {};
_.each(boards, function(board, index) {
  _.each(board.tasks, function(task) {
    taskIds[task.id] = index;
  });
});

现在,您可以在固定时间内轻松找到任务索引:

boards[taskIds[65]]