Javascript 从对象数组中仅创建一个对象,用于redux reducer

Javascript 从对象数组中仅创建一个对象,用于redux reducer,javascript,redux,Javascript,Redux,我有一个对象数组,比如 [ {id: example1, count: 2}, {id: example2, count:2} ] 我想把它变成一个像 { example1: { id: example1, count: 2}, example2: { id: example2, count: 2}, } ……等等 这应该在使用es6的redux减速器中使用,因此,如果存在可用的或在lodash中的东西 答复: 为了清楚起见,这就是我最终按照@james emanon在回答中的建

我有一个对象数组,比如

[
  {id: example1, count: 2}, {id: example2, count:2}
]
我想把它变成一个像

{
  example1: { id: example1, count: 2},
  example2: { id: example2, count: 2},
}
……等等

这应该在使用es6的redux减速器中使用,因此,如果存在可用的或在lodash中的东西

答复: 为了清楚起见,这就是我最终按照@james emanon在回答中的建议所做的。当然,这只是使用reduce的问题

        case ActionTypes.FETCH_SNAPSHOTS_SUCCESS:
          let snapshots = action.payload.reduce((p, c) =>
            Object.assign({},
              p, {
                [c.id]: c
              }
            ), {}
          )

          return Object.assign({},
            state, {
              isFetching: false,
              lastUpdated: action.meta.receivedAt
            },
            snapshots
          )
什么样的

  function arrayToObj(array, keyProperty){
    var result = {}

    for (var i = 0, l = array.length; i<l;i++)
        result[array[i][keyProperty]] = array[i];

    return result;
    }
函数ArrayTobj(数组,keyProperty){
var result={}

对于(var i=0,l=array.length;i


假设
example1
example2
应该是字符串(例如
“example1”
“example2”
),使用
es6
箭头表示法:

let arrayToObj = (arr) => {
  let o = {};
  arr.forEach( (x) => o[x.id]=x );
  return o;
};

这只是语法上的甜言蜜语

reduce
中的每次迭代中实例化一个新对象会导致性能损失吗@这可能是一个视频,但你的列表有多大?大概他们正在构建一个用户界面,甚至没有为100个元素这么做。计算机速度非常快……一个更好的折衷问题是,这是可读性更强还是可读性更低(对于熟悉这两种风格的人来说)对我来说,这是一种偏好。我本可以将其进一步缩短,但我不喜欢必须创建一个outterscope变量来“存储”的想法事情。一旦函数折叠起来,objs就会被垃圾收集。另外,你必须为函数创建内存分配。我没有。我认为JS引擎现在的性能非常好,你必须处理成千上万个操作的10次,才能注意到很大的不同。@jamesemanon@Merlyn这不是O(n!)时间复杂性?(我关心的不是内存。)在每次迭代中,
p
对象中的属性数量都会增加。(也就是说,在“spread”操作符中隐藏着第二次迭代。)因此,在
reduce
的第二次迭代中,我们必须迭代一个属性来传播
…p
,但是在
reduce
的第100次迭代中,我们必须迭代99个属性来传播
…p
。@这个vidor是的,我说得太快了。我没有注意到它在我的快速浏览中复制了以前的迭代,并且我想你可能只是担心分配新对象。我想你错认为它是O(n!)-我认为它实际上是O(n^2)。如果你的列表大小是10,我仍然不在乎,如果它更“可读”.N^2 for 100是相当大的,所以您确实有一点。使用内联赋值的reduce版本要好得多-性能与您的解决方案类似(减去函数调用开销)。您真的需要在reducer中进行这种转换吗?
action.yourArrayofObj
                     .reduce((p,c) => {
                             p[c.id] = c
                             return p 
                    }, {})
let arrayToObj = (arr) => {
  let o = {};
  arr.forEach( (x) => o[x.id]=x );
  return o;
};