Reputation: 282
Want to create one array from another array of objects as below using javascript. arr is the input array and it should output as outArr
Input Array:
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}
]
Output Array:
var outArr = [
{
name: 'A',
email: 'B',
address: 'C'
},
{
name: 'A1',
email: 'B1',
address: 'C1'
}
]
Upvotes: 1
Views: 93
Reputation: 758
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
})
}
}
Heres a simple answer with a for loop.
Upvotes: 0
Reputation: 191986
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>
Or use lodash/fp to get a terser functional solution:
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>
Upvotes: 0
Reputation: 386654
You could get the rest of the object and add it to an object of the result array with the flag as index.
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; }
Upvotes: 2
Reputation: 37755
Using normal javascript reduce
you can do it like this.
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)
Upvotes: 0
Reputation: 17616
Using 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]);
Upvotes: 1