为了避免索引而使用Array.map是否值得?

问题描述 投票:-1回答:1

请考虑以下代码段:

function getMaxAge(arr, id, max) {
  let found = false
  for (let i = 0; i < arr.length; i++) {
    const val = arr[i];
    if (val.id === id) {
      found = true
      if (max > val.age) val.age = max
    }
    return val
  })

  if (found === false) {
    arr.push({
      id: id,
      age: max
    })
  }
  return arr
}

现在使用map观看相同的逻辑:

function getMaxAge(arr, id, max) {
  let found = false
  arr = arr.map((val, index) => {
    if (val.id === id) {
      found = true
      if (max > val.age) val.age = max
    }
    return val
  })

  if (found === false) {
    arr.push({
      id: id,
      age: max
    })
  }
  return arr
}

我感兴趣的不是函数的逻辑,而是在这种情况下使用Array.map是否合理?

javascript
1个回答
0
投票

我个人尽可能避免手动迭代。迭代器方法是基于手动迭代的概念,可以让对象自己决定如何进行迭代。因此,如果您有选择,我会避免手动迭代。有几件事要牢记。

通常来说,在迭代时更改集合时,我会避免使用迭代方法。因为您不知道实现,所以您不完全知道在迭代过程中向集合中添加/删除元素时发生了什么。

当您明确需要使用索引(而不是元素)时,手动进行迭代可能会很麻烦。

基于以上所述,很高兴知道可以使用哪些迭代方法,因为不同的方法可以完成不同的任务。知道在哪种情况下使用哪种方法将导致更好的性能和更简洁的代码。

以您的示例为例,将其更改为以下内容:

function getMaxAge(arr, id, max) {
  arr = arr.slice();
  const matchesId = arr.filter(val => val.id == id),
        found = matchId.length;

  matchesId.filter(val => val.age < max)
           .forEach(val => (val.age = max));

  if (!found) arr.push({id: id, age: max});
  return arr;
}

-1
投票

如果我们在评论中添加您的问题“我想问的是,调用.map(创建另一个副本)的成本是否值得为原始问题键入arr [i]的努力?”假设您在迭代函数之间陷入困境vs.关于性能的for循环中的手动迭代,那么我想我们可以大致回答如下:

  1. 对于小数组-没关系。
  2. 对于大数组-for循环肯定更好

对于大型数组和关键性能(要使代码保持在某些fps阈值时间以下),您需要注意许多不同的事情:缓存变量值(例如arr.length),只要有条件就进行对象池化可能,将工作转移给后台工作者,等等...

但请记住,过早的优化是万恶之源。换句话说,从大多数可读的函数开始(当然,适当地使用它们:P),并根据需要对特定情况进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.