вложенный объект, комбинация массивов - PullRequest
0 голосов
/ 16 апреля 2020

Итак, у меня есть дилемма. У меня есть следующий код

  const loc = [
    { location_key: [32, 22, 11], autoassign: 1 },
    { location_key: [41, 42], autoassign: 1 }
  ];
  const bulkConfigs = [
    {
      dataValues: {
        config_key: 100,
      }
    },
    {
      dataValues: {
        config_key: 200,
      }
    }
  ];

Мне нужно создать объект, похожий на этот:

  config_key: here get the config key from from bulkConfigs,
  location_key: here get the location_key,
  autoassign: 1

Также мне нужно, чтобы этот объект был создан

                config_key: config_key,
                location_key: '',
                autoassign: 1,

столько, сколько раз, поскольку они являются местоположениями для каждого config_key, то, что я имею в виду в этом примере от config_key: 200, у нас будет 2 объекта, подобных этому, и для config_key: 100 у нас будет 3 объекта, подобных этому. Я полагаю, что это можно сделать с помощью Reduce. Кроме того, bulkConfigs и lo c могут содержать более двух объектов, но их число всегда будет одинаковым, например, если они равны 3, то будет также 3 lo c. , но location_key может быть другим, у одного может быть 7 location_key, у других 4, а у последнего просто 1.

Другими словами, массивы всегда имеют одинаковую длину и всегда в одном и том же порядке, поэтому у них одинаковый индекс. Может измениться только location_key, и мне нужно, чтобы объект создавался столько раз, сколько существует location_key.

Я пробовал несколько вещей, но я не знаю, когда дело доходит до этого материала ... Я просто не могу сделать, вот что происходит, когда вы начинаете с реакции, а не сценария java :)

1 Ответ

0 голосов
/ 17 апреля 2020

Хорошо, так что мне удалось сделать это, используя loda sh, вот мое решение, я знаю, что оно вложено как ад, и, вероятно, это можно сделать намного проще, но для новичка ie достаточно хорошо. Не стесняйтесь предлагать более элегантные решения.

Если у вас есть похожая проблема, вот решение. Песочница с кодом, в которую можно играть: https://codesandbox.io/s/epic-field-bdwyi?file= / src / index. js

import _ from "lodash";

const locs = [{ location_key: [32, 22, 11] }, { location_key: [41, 42] }];
const bulkConfigs = [
  {
    dataValues: {
      config_key: 100
    }
  },
  {
    dataValues: {
      config_key: 200
    }
  }
];

// map over the array of bulckConfigs and get indexes
const mergedArrays = _.map(bulkConfigs, (bulkConfig, i) => {
  // create the object that we need
  const objectNeed = {
    // flatMap over the locs array to get flat values from objects in it
    location_key: _.flatMap(locs, ({ location_key }, index) => {
      // match the indexs of both arrays
      if (index === i) {
        // return the location_key values for each config
        return location_key;
      } else {
        // compact to remove the undefinded values returned
        return _.compact();
      }
    }),
    config_key: bulkConfig.dataValues.config_key,
    autoassign: 1
  };

  return objectNeed;
});

// now we just need to crate the same object as many locations and use flatMap to flatten the objects
const allObjects = _.flatMap(mergedArrays, mergedArray => {
  const yy = _.map(mergedArray.location_key, location => {
    const zz = {
      location_key: location,
      config_key: mergedArray.config_key,
      autoassign: 1
    };
    return zz;
  });
  return yy;
});

console.log(allObjects);

И более элегантная версия :)

const getConfigs = (locEl, index) => {
  return _.map(locEl.location_key, (locationKey) => {
    return {
      location_key: locationKey,
      config_key: bulkConfigs[index].dataValues.config_key,
      autoassign: 1,
    };
  });
};

const configLocations = _.chain(locs)
  .map(getConfigs)
  .flatten()
  .value();

console.log(configLocations);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...