Объект.Назначать, не создавая новых экземпляров

#javascript #reactjs #object #redux #mapping

#javascript #reactjs ( реакция ) #объект #сокращение #отображение #reactjs #переопределение #сопоставление

Вопрос:

У меня есть следующий код, создающий полезную нагрузку действия для Redux:

   export function getInfoFromAPI() {
  const initialAction = {
    type: types.GET_SETTLE_SHEETS_FROM_LOCAL_API
  };
  let returnedAction = {};
  let payloadBuild = {};
  return dispatch => {
    return APItools.getInfoFromLocalAPI()
      .then(jsonResult => {
        Object.keys(jsonResult).map( (resultArrayId) => {
          debugger;
          const { foo, bar, foobar, foofoo, barbar} = jsonResult[resultArrayId];
          payloadBuild = _.merge({}, 
            {
              [barbar]: {
                foo: foo,
                bar: bar,
                foobar: foobar,
                foofoo: foofoo,
                barbar: barbar
              }
            });
        });
        returnedAction = Object.assign({}, initialAction,
          {
            payload: payloadBuild
          });
        dispatch(returnedAction);
      });
  };
}
  

Я пытаюсь создать единый объект json, который будет охватывать данные, поступающие из моего локального API. Когда я раньше использовал Object.assign(), это работало бы, добавляя информацию на основе ключа и добавляя ее к уже существующему объекту, как вы и предполагали.

Я попробовал Lodash _.merge() и Object.assign оба, переключая их, и, похоже, это не работает… он продолжает перезаписывать ключ [barbar] следующим значением, поступающим из функции map, даже если это было бы похоже

 [barbar] = 1 
  

тогда

 [barbar] = 2
  

Это заменит ключ и все его дочерние элементы …. почему? А также как мне это исправить? Когда я использовал Object.assign раньше, он просто добавлял новые ключи к объекту, но, я думаю, это было только по одному за раз. Это первый раз, когда я использую map, который, как я предполагаю, просто продолжит добавлять новые объекты с их уникальными ключевыми значениями.

Ответ №1:

Вы забываете объединить свои старые значения

 let buildValue = {}

arrayWithStuff.map(info => {
  buildValue = Object.assign(buildValue, {
    [info.bar] : {
      Other stuff..
    })
  

Вы объединяете каждый результат с новым пустым объектом (первый аргумент).

Удачи!

Комментарии:

1. Да! Я только что нашел это, как вы опубликовали 🙂 спасибо. Я отмечу ваш ответ как ответ, чтобы дать вам очки! 🙂

Ответ №2:

Найден ответ:

 payloadBuild = _.merge({}, payloadBuild <---- this needed to be added
            {
              [barbar]: {
                foo: foo,
                bar: bar,
                foobar: foobar,
                foofoo: foofoo,
                barbar: barbar
              }
            });