我目前正在尝试将各种特征的数据集合在一起。我是演习的最后一部分,那就是:
转过来:
[
{
"AU": {
"iOS": 1
}
},
{
"US": {
"iOS": 2
}
},
{
"CA": {
"iOS": 1
}
},
{
"US": {
"Android": 1
}
},
{
"DO": {
"Android": 1
}
}
]
进入这个:
[
{
"AU": {
"iOS": 1
}
},
{
"US": {
"iOS": 2,
"Android": 1
}
},
{
"CA": {
"iOS": 1
}
},
{
"DO": {
"Android": 1
}
}
]
换句话说,groupBy CountryCode并保留各自的iOS或Android标签。另外,请记住,不允许计算密钥。 Computed Keys非常感谢任何帮助。
答案 0 :(得分:1)
使用一点omap
助手和Object.assign
这是一项非常简单的任务
let input = [
{ "AU": { "iOS": 1 } },
{ "US": { "iOS": 2 } },
{ "CA": { "iOS": 1 } },
{ "US": { "Android": 1 } },
{ "DO": { "Android": 1 } }
]
let omap = (o,f)=>
Object.keys(o).reduce((acc, k)=>
Object.assign(acc, { [k]: f(o[k], k, o) }), {})
var output = input.reduce((acc, x) =>
Object.assign(acc, omap(x, (v, k)=>
acc[k] === undefined
? v
: Object.assign({}, acc[k], v))), {})
console.log(output)
<强>解释强>
omap
允许您像数组一样映射对象
let omap = (o,f)=>
Object.keys(o).reduce((acc, k)=>
Object.assign(acc, { [k]: f(o[k], k, o) }), {})
omap({a:1, b:2, c:3}, x=> x*x)
//=> {a:1, b:3, c:9}
使用omap
,我们可以迭代每个输入并将键映射到最终输出对象
// reduce the list of inputs by ...
var output = input.reduce((acc, x) =>
// assigning to the final output, the omap'd input
Object.assign(acc, omap(x, (v, k)=>
// if the final output doesn't have a matching key
acc[k] === undefined
// return the input's value
? v
// otherwise return the existing final output merged with the input value
: Object.assign({}, acc[k], v))), {})
console.log(output)
答案 1 :(得分:0)
我不确定你的意思是什么,不允许使用计算键,但我在https://jsfiddle.net/ezrajr/z35q9s3h/
设置了一个jsfiddle这会将您的数据数组转换为数据对象,这意味着您不必再了解索引。您可以使用字符串访问符号直接访问数据:
app
或点符号:
data['US']['iOS'];
任何一个都可用于访问数据,但通常在您知道密钥时使用点表示法,并且在动态设置密钥时使用字符串表示法。
答案 2 :(得分:0)
完全是香草的JavaScript -
input.forEach(function(item){
Object.keys(item).forEach(function(country){
var systems = item[country]
if (!obj[country]) obj[country] = {}
Object.keys(systems).forEach(function(system){
if (!obj[country][system]) obj[country][system] = item[country][system]
else obj[country][system] += item[country][system]
})
})
})
如果你可以使用库(如Underscore或JQuery),你也可以收紧语法