Как объединить/объединить несколько объектов в массив

я ищу лучший способ объединить объект в массив.. это моя проблема:

Object {
  "payload": Array [
    Object {
      "category": "kontrakan",
    },
    Object {
      "Tenant": "anji",
    },
  ],
  "type": "GET_DATA_VENUE_SUCCESS",
}

Object {
  "payload": Array [
    Object {
      "category": "kost",
    },
    Object {
      "Tenant": "ade",
    },
  ],
  "type": "GET_DATA_VENUE_SUCCESS",
} 

ожидать преобразования следующим образом:

{
  [
   {"category" : "kontrakan","Tenant" : "anji"}, 
   {"category" : "kost", "Tenant" : "ade"}
  ]
}

вот код:

let obj = doc.data();
let arrObj = _.map(_.keys(obj), key => ({ [key]: obj[key] }));
console.log(arrObj);

я уже пытался с другими решениями. object.assign/key, lodash : _.merge, объединение все еще не работает идеально...


person squidLiquid    schedule 18.12.2019    source источник
comment
Я совсем запутался, можете ли вы объяснить, откуда берутся A, B, Fizz и Fuzz?   -  person Ele    schedule 18.12.2019
comment
Привет, можешь привести пример входных данных?   -  person wmbtrmb    schedule 18.12.2019
comment
Значение A, B и FIzz Fuzz - это просто пример значения, я его отредактирую.   -  person squidLiquid    schedule 18.12.2019
comment
Кроме того, желаемый результат недействителен.   -  person Ele    schedule 18.12.2019
comment
Из какого синтаксиса происходят исходные объекты?   -  person zer00ne    schedule 18.12.2019


Ответы (3)


Вы можете использовать метод map в сочетании с reduce и Object.assign для объединения objects свойств.

var arr = [{ "payload": [ { "category": "kontrakan", }, { "Tenant": "anji", } ], "type": "GET_DATA_VENUE_SUCCESS", }, { "payload": [ { "category": "kost", }, { "Tenant": "ade", }, ], "type": "GET_DATA_VENUE_SUCCESS", }]

var result = arr.map(({payload}) => payload.reduce((obj, item) => Object.assign(obj, item), {}));
console.log(result);

person Mihai Alexandru-Ionut    schedule 18.12.2019

Вам нужна функция reduce.

Вы можете использовать сокращение, чтобы объединить данные «полезной нагрузки» в один объект. Используя объект в качестве аккумулятора.

Пример:

const a = {
  payload: [{
    category: 'a'
  },
  {
    tenant: 'a'
  }]
};


function mergePayload(obj) {
  return obj.payload.reduce((newObj, payloadObj) => {
    // Create a new object with the properties of the old and the new combined
    return Object.assign(newObj, payloadObj);
  }, {});
}

// {category: "a", tenant: "a"}
console.log(mergePayload(a))

Вы можете сопоставить массив с данными с редуктором:

const data = [a, a];

// [{category: "a", tenant: "a"}, {category: "a", tenant: "a"}]
console.log(data.map((d) => mergePayload(d)));

Изменить: вы можете сделать сокращение короче, но это больше не освободит место для комментария.

function mergePayload(obj) {
  return obj.payload.reduce((newObj, payloadObj) => Object.assign(newObj, payloadObj), {})
}
person Jeffrey Devloo    schedule 18.12.2019

Предполагая, что у вас есть только два объекта в массиве, а возможными свойствами являются «категория» и «арендатор».

let arr = [{  "payload": [{      "category": "kontrakan",    },    {      "Tenant": "anji",    },  ],  "type": "GET_DATA_VENUE_SUCCESS"}, {  "payload": [{      "category": "kost",    },    {      "Tenant": "ade",    },  ],  "type": "GET_DATA_VENUE_SUCCESS"}],
    result = arr.map(({payload: [{category: category}, {Tenant: tenant}]}) => ({category, tenant}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Ele    schedule 18.12.2019