我尝试做这个对象
obj={
a:{ 1:"x", 2:"c"},
b:{ 1:"v", 2:"b" },
c:{ 4:"n", 2:"k" }
}
到
obj=[
0:{group:"a" ,1:"x"},
1:{group:"a", 2:"c"},
2:{group:"b",1:"v"},
3:...]
答案 0 :(得分:1)
使用Object.keys
从对象获取所有键。然后在回调函数内部使用数组reduce
和回调函数内的对象,并创建一个新对象。
let obj = {
a: {
1: "x",
2: "c"
},
b: {
1: "v",
2: "b"
},
c: {
4: "n",
2: "k"
}
}
let m = Object.keys(obj);
let z = m.reduce(function(acc, curr) {
if (typeof(obj[curr]) === 'object') {
for (let keys in obj[curr]) {
let __ob = {};
__ob.group = curr;
__ob[keys] = obj[curr][keys]
acc.push(__ob)
}
}
return acc;
}, [])
console.log(z)
答案 1 :(得分:1)
您可以使用Object.entries()
将对象转换为数组。使用.reduce()
,.concat()
和map()
构造新数组
let obj = {
a: {
1: "x",
2: "c"
},
b: {
1: "v",
2: "b"
},
c: {
4: "n",
2: "k"
}
}
let result = Object.entries(obj)
.reduce((c, [k, v]) => c.concat(Object.entries(v).map(o => ({group: k,[o[0]]: o[1]}))), [])
console.log(result);
答案 2 :(得分:1)
您可以在两个级别上迭代密钥,并使用ES6 / ES2015提供的计算密钥语法:
let obj={ a:{ 1:"x", 2:"c"}, b:{ 1:"v", 2:"b" }, c:{ 4:"n", 2:"k" } }
let result = []
for (let k1 in obj){
for (let k2 in obj[k1] ){
result.push({group:k1,[k2]:obj[k1][k2]})
}
}
console.log(result)
答案 3 :(得分:1)
使用lodash,用_.flatMap()
迭代对象。在flatMap的回调中,第一个参数是值(例如{ 1: 'x', 2: 'c' }
),第二个参数是键(例如a
)。将第二个参数分配给group
。使用_.toPairs()
获取成对的数组([key, value]
)。使用Array.map()
将对转换为对象,并包含group
:
const obj = {"a":{"1":"x","2":"c"},"b":{"1":"v","2":"b"},"c":{"2":"k","4":"n"}};
const result = _.flatMap(obj,
(o, group) =>
_.toPairs(o).map(([k, v]) => ({
group,
[v]: k
})));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>