Debarth
Debarth

Reputation: 282

Re-framing array of objects from another array in javascript

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

Answers (5)

Karolis Stakėnas
Karolis Stakėnas

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

Ori Drori
Ori Drori

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

Nina Scholz
Nina Scholz

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

Code Maniac
Code Maniac

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

kockburn
kockburn

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

Related Questions