Переопределение массива объектов из другого массива в JavaScript - PullRequest
0 голосов
/ 20 января 2019

Хотите создать один массив из другого массива объектов, как показано ниже, используя 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'
   }
]

Ответы [ 5 ]

0 голосов
/ 20 января 2019
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.

0 голосов
/ 20 января 2019

Вы можете получить оставшуюся часть объекта и добавить его к объекту массива результатов с флагом в качестве индекса.

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; }
0 голосов
/ 20 января 2019

Группа элементы по flag, затем _.merge() элементы, удаляются flag с использованием _.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>
0 голосов
/ 20 января 2019

Используя обычный 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)
0 голосов
/ 20 января 2019

Использование Массив # уменьшение , деструктурирование и синтаксис распространения , Карта и Значения # карты .

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