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