Обновить существующее свойство объекта, если ключ совпадает - PullRequest
2 голосов
/ 27 марта 2019

Я пытаюсь создать объект, подобный этому:

type: "asset", value: { long: 1.45, short: 1.67, extendedLong: 2.67 }

из этого:

[{percent: 1.45, type: long, sector: asset}, {percent: 1.67, type: short, sector: asset}, {percent: 2.67, type: extendedLong, sector: asset}

Я попробовал подход к поддержанию объекта, который пуст в начале. Я делал что-то вроде этого:

 if (!object[asset]) {
   object[asset] = { long: 1.45 }
  }
 else object[asset] = { short: 1.67}

но это не работает. Может кто-нибудь помочь, пожалуйста?

1 Ответ

3 голосов
/ 27 марта 2019

Вы можете отобразить новые объекты и назначить все одному объекту.

var array = [{ percent: 1.45, type: 'long', sector: 'asset' }, { percent: 1.67, type: 'short', sector: 'asset' }, { percent: 2.67, type: 'extendedLong', sector: 'asset'}],
    result = Object.assign(...array.map(({ percent, type }) => ({ [type]: percent })));

console.log(result);

Для более глубоких вложенных объектов вам нужен другой подход, поскольку при присваивании вложенному объекту объект удаляет драгоценно сохраненные вложенные объекты. Вместо этого вы можете уменьшить массив и сохранить структуру желаемого результата.

var array = [{ percent: 1.45, type: 'long', sector: 'asset' }, { percent: 1.67, type: 'short', sector: 'asset' }, { percent: 2.67, type: 'extendedLong', sector: 'asset' }, { percent: 1.45, type: 'long', sector: 'Convertible' }, { percent: 1.67, type: 'short', sector: 'Convertible' }, { percent: 2.67, type: 'extendedLong', sector: 'Convertible' }],
    result = array.reduce((o, { percent, type, sector }) => {
        o[sector] = o[sector] || {};
        o[sector][type] = percent;
        return o;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...