Object.assign (), объединить / перезаписать ключи, скопировать значения массива для создания объекта - PullRequest
0 голосов
/ 26 сентября 2018

Раньше у меня был массив с одним объектом, например: var myObj = [{'key': {an object}}];

Я конвертирую его в объект, например так: Object.assign({}, ...myobj)

, чтобы получить это: {'key': [{an object}]}

Проблема в том, что на myobj теперь у меня есть два предмета с одинаковым КЛЮЧОМ, вот так:

[{'key': {an object}}, {'key': {another object}}]

Результат, который я получу, еслия выполняю тот же Object.assign - это один объект с двумя другими объектами внутри него, и это нормально: {'key': {an object}}, {'key': {another object}}

Вопрос в том, могу ли я преобразовать свой myobj в эту структуру:

{'key': [{an object}, {another object}]}

Ответы [ 5 ]

0 голосов
/ 26 сентября 2018

Вы можете использовать уменьшение, чтобы достичь этого

        const obj = [{key: {val: 1}}, {key: {val: 2}}]
        const reqObj = obj.reduce((acc, cur) => [...acc, cur.key],[])
        console.log('reqObj: ', reqObj)
0 голосов
/ 26 сентября 2018
const finalObj = {};
const myObj =  [{'key': { obj : "hello"}}, {'key': { obj : "hello"}}, {'key2': {obj : "world"}}, {'key3': {obj : "world"}}];

for( const oj of myObj) {
  const key = Object.keys(oj)[0];

  if(finalObj[key]){
     const tempArray =[].concat(finalObj[key]);
     tempArray.push(oj[key]);
     finalObj[key] = tempArray         
  }else{
   finalObj[key] = oj[key];
  }

}

console.log(finalObj);

Final Output : {"key":[{"obj":"hello"},{"obj":"hello"}],"key2":{"obj":"world"},"key3":{"obj":"world"}}
0 голосов
/ 26 сентября 2018

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

const mergeObjects = (obj1, obj2) => 
  [...Object.entries(obj1), ...Object.entries(obj2)].reduce(
    (merged, [k, v]) => Object.assign(
      merged,
      { [k]: (merged[k] || []).concat(v) }
    ),
    {}
  );

console.log(mergeObjects({ key: "a"}, { key: "b" }));
console.log(
  [
    { key: "a", test: "b" }, { key: "c" }, { key: "d" } 
  ].reduce(mergeObjects)
);
0 голосов
/ 26 сентября 2018

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

function merge(...objects) {
    return objects.reduce((a, b) => {
        Object.entries(b).forEach(([k, v]) => {
            if (!(k in a)) {
                return a[k] = v;
            }
            if (!Array.isArray(a[k])) {
                a[k] = [a[k]];
            }
            a[k].push(v);
        });
        return a;
    }, {});
}
    
console.log(merge({ key: { foo: 'bar' } }, { key: { foo: 'baz' } }));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 26 сентября 2018

Вы можете использовать Array.map():

const data = [{'key': 'an object'}, {'key': 'another object'}];

const result = {
  key: data.map(o => o.key)
};

console.log(result);
...