在 javascript 中从另一个数组重新构建对象数组
Re-framing array of objects from another array in javascript
想要从另一个对象数组创建一个数组,如下所示
javascript。 arr 是输入数组,它应该输出为 outArr
输入数组:
var arr = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
]
输出数组:
var outArr = [
{
name: 'A',
email: 'B',
address: 'C'
},
{
name: 'A1',
email: 'B1',
address: 'C1'
}
]
使用 Array#reduce, destructuring, and spread syntax, Map and Map#values.
const data = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
];
const res = data.reduce((a,{flag, ...rest})=>{
return a.set(flag, {...a.get(flag), ...rest});
}, new Map()).values();
console.log([...res]);
Group the items by flag
, then _.merge()
the items, are remove flag
using _.omit()
.
const arr = [{"name":"A","flag":0},{"email":"B","flag":0},{"address":"C","flag":0},{"name":"A1","flag":1},{"email":"B1","flag":1},{"address":"C1","flag":1}]
const fn = _.flow(
arr => _.groupBy(arr, 'flag'),
groups => _.map(groups, g => _.omit(_.merge({}, ...g), 'flag')),
)
const result = fn(arr)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
或使用lodash/fp获得更简洁的功能解决方案:
const arr = [{"name":"A","flag":0},{"email":"B","flag":0},{"address":"C","flag":0},{"name":"A1","flag":1},{"email":"B1","flag":1},{"address":"C1","flag":1}]
const fn = _.flow(
_.groupBy('flag'),
_.map(_.flow(
_.mergeAll,
_.omit('flag')
)),
)
const result = fn(arr)
console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
使用正常 javascript reduce
你可以这样做。
var arr = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
]
let output = Object.values( arr.reduce((op,cur)=>{
let key = Object.keys(cur)[0]
if(op[cur.flag]){
op[cur.flag][key] = cur[key]
} else {
op[cur.flag] = {key:cur[key]}
}
return op;
},{}) )
console.log(output)
您可以获得对象的其余部分并将其添加到结果数组的对象中,并将标志作为索引。
var array = [{ name: 'A', flag: 0 }, { email: 'B', flag: 0 }, { address: 'C', flag: 0 }, { name: 'A1', flag: 1 }, { email: 'B1', flag: 1 }, { address: 'C1', flag: 1 }],
result = array.reduce((r, { flag, ...o }) => {
Object.assign(r[flag] = r[flag] || {}, o);
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
var arr = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
]
var outputarray = []
for (var i = 0; i < arr.length; i++) {
if ((i % 3 === 0)) {
outputarray.push({
name: arr[i].name,
email: arr[i + 1].email,
address: arr[i + 2].address
})
}
}
这是一个带有 for 循环的简单答案。
想要从另一个对象数组创建一个数组,如下所示 javascript。 arr 是输入数组,它应该输出为 outArr
输入数组:
var arr = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
]
输出数组:
var outArr = [
{
name: 'A',
email: 'B',
address: 'C'
},
{
name: 'A1',
email: 'B1',
address: 'C1'
}
]
使用 Array#reduce, destructuring, and spread syntax, Map and Map#values.
const data = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
];
const res = data.reduce((a,{flag, ...rest})=>{
return a.set(flag, {...a.get(flag), ...rest});
}, new Map()).values();
console.log([...res]);
Group the items by flag
, then _.merge()
the items, are remove flag
using _.omit()
.
const arr = [{"name":"A","flag":0},{"email":"B","flag":0},{"address":"C","flag":0},{"name":"A1","flag":1},{"email":"B1","flag":1},{"address":"C1","flag":1}]
const fn = _.flow(
arr => _.groupBy(arr, 'flag'),
groups => _.map(groups, g => _.omit(_.merge({}, ...g), 'flag')),
)
const result = fn(arr)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
或使用lodash/fp获得更简洁的功能解决方案:
const arr = [{"name":"A","flag":0},{"email":"B","flag":0},{"address":"C","flag":0},{"name":"A1","flag":1},{"email":"B1","flag":1},{"address":"C1","flag":1}]
const fn = _.flow(
_.groupBy('flag'),
_.map(_.flow(
_.mergeAll,
_.omit('flag')
)),
)
const result = fn(arr)
console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
使用正常 javascript reduce
你可以这样做。
var arr = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
]
let output = Object.values( arr.reduce((op,cur)=>{
let key = Object.keys(cur)[0]
if(op[cur.flag]){
op[cur.flag][key] = cur[key]
} else {
op[cur.flag] = {key:cur[key]}
}
return op;
},{}) )
console.log(output)
您可以获得对象的其余部分并将其添加到结果数组的对象中,并将标志作为索引。
var array = [{ name: 'A', flag: 0 }, { email: 'B', flag: 0 }, { address: 'C', flag: 0 }, { name: 'A1', flag: 1 }, { email: 'B1', flag: 1 }, { address: 'C1', flag: 1 }],
result = array.reduce((r, { flag, ...o }) => {
Object.assign(r[flag] = r[flag] || {}, o);
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
var arr = [
{name: 'A', flag: 0},
{email: 'B', flag: 0},
{address: 'C', flag: 0},
{name: 'A1', flag: 1},
{email: 'B1', flag: 1},
{address: 'C1', flag: 1}
]
var outputarray = []
for (var i = 0; i < arr.length; i++) {
if ((i % 3 === 0)) {
outputarray.push({
name: arr[i].name,
email: arr[i + 1].email,
address: arr[i + 2].address
})
}
}
这是一个带有 for 循环的简单答案。