javascript - 根据属性拆分数组的值,然后形成一个新的对象数组
问题描述
我有一个包含具有以下结构的数组的对象:
var obj = {
"feature1" : ["val1","val2"],
"feature2" : ["val3"]
}
现在我想拆分每个数组中存在的值并形成一个新的对象数组,它们应该像:
var result = [
{
"field": "feature1",
"value": "val1",
"type": "add"
},
{
"field": "feature1",
"value": "val2",
"type": "add"
},
{
"field": "feature2",
"value": "val3",
"type": "add"
}
]
此处必须根据“字段”进行拆分,并显示与上述类似的内容。此处“类型”是硬编码的额外字段
帮助将不胜感激。
解决方案
您可以获取键/值对,遍历它们,然后遍历每个数组中的每个值,然后将每个值推入一个对象,然后返回累加器
var obj = {
"feature1": ["val1", "val2"],
"feature2": ["val3"]
}
const output = Object.entries(obj)
.reduce((a, [k, v]) => a
.concat(v
.map(e => ({
field: k,
value: e,
type: 'add'
})
)
), [])
console.log(output)
或者,作为一行可读性较差的版本:
var obj = {
"feature1": ["val1", "val2"],
"feature2": ["val3"]
}
const output = Object.entries(obj).reduce((a, [k, v]) => a.concat(v.map(e => ({field: k, value: e, type: 'add'}))), [])
console.log(output)
对于更注重性能的解决方案,您应该使用普通的旧 for 循环:
var obj = {
"feature1": ["val1", "val2"],
"feature2": ["val3"]
}
const out = []
for (var o in obj) {
const arr = obj[o]
for(var i = 0; i < arr.length; i++) {
out.push({
field: o,
value: arr[i],
type: 'add'
})
}
}
console.log(out)
这是一个显示性能差异 的JSPerf
编辑:
var obj = {
"feature1": ["1", "1", "2", "3", "1"],
"feature2": ["val3"]
}
const output = Object.entries(obj).reduce((a, [k, v]) => a.concat([...new Set(v)].map(e => ({field: k, value: e, type: 'add'}))), [])
console.log(output)
推荐阅读
- odoo - 如何避免在 Odoo 8 中为多个客户发票更新付款?
- ios - 使用 xcode 9.2 的情节提要中的不一致错误
- android - 导入 ICS 事件的错误时间
- flask-sqlalchemy - 使用 bulk_save_objects 获取插入的主键 ID
- wordpress - Wordpress 联系表 7 重定向延迟
- android - 在 Raspberry Pi 3 上通过 GPU 播放 Android Things 视频
- javascript - Hyperledger Sawtooth:Javascript 中的事务处理器
- vba - VBA:在运行时加载自定义功能区并访问
- batch-file - 检查文件是否存在并检查文件中的第一行
- php - Laravel 5.5.40 文件上传不起作用