在数组字段上展平嵌套的对象数组
Flatten a nested array of objects over a array field
有一个对象a1 =
[{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]]
期望的输出:
[{name:'x',age:21, addr:{flat:1,add:'xyz'}},
{name:'x',age:21, addr:{flat:2,add:'xsr'}},
{name:'y',age:22, addr:{flat:3,add:'xyz1'},
{name:'y',age:22, addr:{flat:4,add:'xsr1'}]
求推荐!我正在尝试使用 lodash/underscore.
来完成此操作
您可以迭代数组和内部数组来构建想要的结果。
var array = [{ name: 'x', age: 21, addr: [{ flat: 1, add: 'xyz' }, { flat: 2, add: 'xsr' }] }, { name: 'y', age: 22, addr: [{ flat: 3, add: 'xyz1' }, { flat: 4, add: 'xsr1' }] }],
result = array.reduce(function (r, a) {
return r.concat(a.addr.map(function (b) {
return { name: a.name, age: a.age, addr: b };
}));
}, []);
console.log(result);
ES6
var array = [{ name: 'x', age: 21, addr: [{ flat: 1, add: 'xyz' }, { flat: 2, add: 'xsr' }] }, { name: 'y', age: 22, addr: [{ flat: 3, add: 'xyz1' }, { flat: 4, add: 'xsr1' }] }],
result = array.reduce((r, a) => r.concat(a.addr.map(b => ({ name: a.name, age: a.age, addr: b }))), []);
console.log(result);
您可以使用 reduce()
、forEach()
和 Object.assign()
来获得 return 想要的结果。
var data = [{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}];
var result = data.reduce(function(r, o) {
o.addr.forEach(function(e) {
r.push(Object.assign({name: o.name, age: o.age}, e));
})
return r;
}, []);
console.log(result)
将原数组中的每一项映射到一个新数组中,根据addr
字段的个数来映射一个新的数组。使用 concat 将所有内容展平到一个新数组中。
您可以使用 Object.assign()
if you're transpiling to ES5 with babel or similar, as it's not supported by IE. However, since you're using angular, you can use angular.extend
创建新项目。
ES5:
var arr = [
{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}
];
var result = [].concat.apply([], arr.map(function(item) {
return item.addr.map(function(addr) {
return angular.extend({}, item, { addr: addr });
});
}));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
ES6:
const arr = [
{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}
];
const result = [].concat(...arr.map((item) => item.addr.map((addr) => Object.assign({}, item, { addr }))));
console.log(result);
有一个对象a1 =
[{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]]
期望的输出:
[{name:'x',age:21, addr:{flat:1,add:'xyz'}},
{name:'x',age:21, addr:{flat:2,add:'xsr'}},
{name:'y',age:22, addr:{flat:3,add:'xyz1'},
{name:'y',age:22, addr:{flat:4,add:'xsr1'}]
求推荐!我正在尝试使用 lodash/underscore.
来完成此操作您可以迭代数组和内部数组来构建想要的结果。
var array = [{ name: 'x', age: 21, addr: [{ flat: 1, add: 'xyz' }, { flat: 2, add: 'xsr' }] }, { name: 'y', age: 22, addr: [{ flat: 3, add: 'xyz1' }, { flat: 4, add: 'xsr1' }] }],
result = array.reduce(function (r, a) {
return r.concat(a.addr.map(function (b) {
return { name: a.name, age: a.age, addr: b };
}));
}, []);
console.log(result);
ES6
var array = [{ name: 'x', age: 21, addr: [{ flat: 1, add: 'xyz' }, { flat: 2, add: 'xsr' }] }, { name: 'y', age: 22, addr: [{ flat: 3, add: 'xyz1' }, { flat: 4, add: 'xsr1' }] }],
result = array.reduce((r, a) => r.concat(a.addr.map(b => ({ name: a.name, age: a.age, addr: b }))), []);
console.log(result);
您可以使用 reduce()
、forEach()
和 Object.assign()
来获得 return 想要的结果。
var data = [{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}];
var result = data.reduce(function(r, o) {
o.addr.forEach(function(e) {
r.push(Object.assign({name: o.name, age: o.age}, e));
})
return r;
}, []);
console.log(result)
将原数组中的每一项映射到一个新数组中,根据addr
字段的个数来映射一个新的数组。使用 concat 将所有内容展平到一个新数组中。
您可以使用 Object.assign()
if you're transpiling to ES5 with babel or similar, as it's not supported by IE. However, since you're using angular, you can use angular.extend
创建新项目。
ES5:
var arr = [
{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}
];
var result = [].concat.apply([], arr.map(function(item) {
return item.addr.map(function(addr) {
return angular.extend({}, item, { addr: addr });
});
}));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
ES6:
const arr = [
{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]},
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}
];
const result = [].concat(...arr.map((item) => item.addr.map((addr) => Object.assign({}, item, { addr }))));
console.log(result);