在 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 循环的简单答案。