繁体   English   中英

Javascript:对象数组到包含值数组的对象-最有效的方式?

[英]Javascript: Array of objects to object containing arrays of values - most performant way?

所需:循环访问单个对象数组,并以最简洁和高效的方式根据对象中的键构造多个数组以分配给对象。 两种方法:

一:

const arrayOfObjectsToObjectOfArraysOfValues = items => {
  const newArrayOne = []
  const newArrayTwo = []
  const newArrayThree = []

  items.forEach(({ value1, value2, value3 }) => {
    newArrayOne.push(value1)
    newArrayTwo.push(value2)
    newArrayThree.push(value3)
  })

  return { newArrayOne, newArrayTwo, newArrayThree }
}

二:

const arrayOfObjectsToObjectOfArraysOfValues = items => ({
   newArrayOne: items.map(({ value1 }) => value1),
   newArrayTwo: items.map(({ value2 }) => value2),
   newArrayThree: items.map(({ value3 }) => value3),
})

编辑(也有此选项):

const arrayOfObjectsToObjectOfArraysOfValues = items => {
  return items.reduce((r, { value1, value2, value3 }, i) => {
    r.newArrayOne[i] = value1;
    r.newArrayTwo[i] = value2;
    r.newArrayThree[i] = value3;
    return r;
  }, { newArrayOne: [], newArrayTwo: [], newArrayThree: [] });
}

显然,第二个循环更简洁,但是在只需要一个循环的情况下进行三个循环就可以批评它了。 另一方面,第一个循环每个循环执行3次操作。 关键问题选项是“哪个(或另一个更优雅)选项(哪个)表现最出色?”

好的,我是第一次上jsperf潮流……看起来答案就在这里,这取决于客户端:

https://jsperf.com/arrayofobjectstoobjectofarraysofvalues/1

在Firefox上,选项1慢23%。 (每秒832,000次基准操作)
在Chrome上,选项2慢88%。 (每秒248,000次基准操作)
在Safari上,选项2慢48%。 (每秒158,000次操作基准)

编辑:减少选项在Chrome和Safari中慢2%,但在Firefox中慢50%。

因此,可能是的,在大多数情况下,选项1更好。 为了简洁起见,还真可惜...另外,使用Firefox-太快了!

最后,我认为使用reduce可以使选项一变得简明扼要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM