假设我有这些数据:
var obj = [
{
type: 1,
value: "abc"
},
{
type: 2,
value: "abcde"
},
{
type: 1,
value: "fghez"
}
];
JavaScript中是否有一种高效优雅的方法将其转换为对象,如下所示?
var sortedByType = {
1: [ "abc", "fghez" ],
2: [ "abcde" ]
}
显然,您可以遍历obj
中的每个元素,阅读type
属性并将value
添加到新对象中,逐个汇总结果,如下所示。但它有点奇怪,长久,低效,不优雅。
var sortedByType = {};
for (var i = 0; i < obj.length; i++) {
var type = obj[i].type;
if (!sortedByType[type]) { sortedByType[type] = []; }
sortedByType[type].push(obj[i].value);
}
答案 0 :(得分:0)
使用Array#forEach
的优雅解决方案。迭代arr
数组。如果obj
实际上没有迭代对象的type
,请将type
设置为obj
密钥并将其value
推入其中。如果有 - 只需将value
推入数组。
var arr = [{type:1,value:"abc"},{type:2,value:"abcde"},{type:1,value:"fghez"}], obj = {};
arr.forEach(v => (obj[v.type] || (obj[v.type] = [])).push(v.value));
console.log(obj);
答案 1 :(得分:0)
另一个优雅的解决方案是使用Array#reduce
方法:
您可以构建一个数组,但它会有未定义的索引(这就是我将filter
放在最后的原因):
obj.reduce((acc, val) => {
if (!acc[val.type])
acc[val.type] = [];
acc[val.type].push(val.value)
return acc;
}, []).filter(n => n)
OR (编辑)
你可以建立一个对象:
obj.reduce((acc, val) => {
let key = val.type.toString();
(acc[key] || (acc[key] = [])).push(val.value)
return acc;
}, {})
-
旧JS版:
obj.reduce(function (acc, val) {
var key = val.type.toString();
(acc[key] || (acc[key] = [])).push(val.value)
return acc;
}, {})
最好的问候,
答案 2 :(得分:0)
您可以将Array#reduce
与对象一起用作累加器。
var array = [{ type: 1, value: "abc" }, { type: 2, value: "abcde" }, { type: 1, value: "fghez" }],
result = array.reduce(function (r, a) {
if (!r[a.type]) {
r[a.type] = [];
}
r[a.type].push(a.value);
return r;
}, Object.create(null));
console.log(result);
&#13;