Как изменить расположение пары «ключ-объект» в JavaScript - PullRequest
0 голосов
/ 18 февраля 2020

Я видел похожие вопросы к этому, но на разных языках, и я изо всех сил пытаюсь создать эквивалент JavaScript.

Я получаю объект, и через функцию я хочу изменить местоположение одно (или несколько) свойств. Например,

С исходным объектом

{
  individual: [
    {
      dob: '2017-01-01',
      isAuthorized: true,
    },
  ],
  business: [
    {
     taxId: '123',
    },
  ],
  product: {
    code: '123',
  },
}

я бы хотел изменить местоположение isAuthorized, чтобы оно было в первом объекте внутри массива business вместо individual.

Примерно так:

{
  individual: [
    {
      dob: '2017-01-01',
    },
  ],
  business: [
    {
     taxId: '123',
     isAuthorized: true,
    },
  ],
  product: {
    code: '123',
  },
}

До сих пор я пытался создать объект, который содержал бы имя ключа и местоположение для его изменения, например

{
  isAuthorized: obj.business[0]
}

И затем l oop поверх исходного объекта, а также объекта со значениями местоположения, а затем задайте местоположение этой пары значений ключа.

По сути, в этой функции я хочу видеть, что если исходный объект содержит определенное значение (в данном случае isAuthorized), что он возьмет эту пару ключ-значение и переместит ее в нужное место.

1 Ответ

0 голосов
/ 18 февраля 2020

То, что вы хотите, может быть легко достигнуто с помощью load sh, вот рабочий фрагмент того, как реструктурировать на основе определенной карты структуры. Расширил этот пример, чтобы он соответствовал тому, что вы хотите.

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

// input data
const data = {
  individual: [
    {
      dob: '2017-01-01',
      isAuthorized: true,
    },
  ],
  business: [
    {
     taxId: '123',
    },
  ],
  product: {
    code: '123',
  },
};

// the structure change map
const keyMap = {
 'individual[0].isAuthorized': 'business[0].isAuthorized'
};


function parseData(data,keyMap) {
  const newData = _.cloneDeep(data);
  for( let [source,dest] of Object.entries(keyMap) ) {
    _.set(newData,dest,_.get(newData,source));
    _.unset(newData,source);
  }
  return newData;
}

console.log(parseData(data, keyMap));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

Примечание: набор load sh рассматривает любое значение цифр c в качестве индекса массива, поэтому, если вы используете ключ объекта цифр c затем используйте loada sh .setWith. Я рекомендую прочитать примеры в do c для лучшего понимания. https://lodash.com/docs/4.17.15#set

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