1

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'
   }
]
2
  • What did you try and what problems are you facing? Commented Jan 20, 2019 at 17:44
  • Are you asking how you would group by flag? Commented Jan 20, 2019 at 17:46

5 Answers 5

2

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; }

Sign up to request clarification or add additional context in comments.

Comments

1

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]);

Comments

0

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)

Comments

0

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>

Comments

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
   })

  }

}

Heres a simple answer with a for loop.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.