Переименование ключей в объекте с использованием метода Reduce в JS - PullRequest
1 голос
/ 17 апреля 2020

Ниже приведен объект, в котором я хочу заменить countryID на value, countryName на label.

В том же объекте у меня есть localLanguages массив, в котором я нахожусь пытается переименовать language с помощью label и languageCode с помощью value.

массива -

var obj = [{
    "countryID": "CON1010",
    "countryName": "Poland",
    "countryCode": "pl",
    "localLanguages": [{
        "language": "English",
        "languageCode": "en"
      },
      {
        "language": "Polish",
        "languageCode": "en"
      }
    ]
  },
  {
    "countryID": "CON1011",
    "countryName": "UK",
    "countryCode": "uk",
    "localLanguages": [{
      "language": "English",
      "languageCode": "en"
    }]
  }
];

Преобразовано в -

var obj = [{
    "value": "CON1010",
    "label": "Poland",
    "countryCode": "pl",
    "localLanguages": [{
        "label": "English",
        "value": "en"
      },
      {
        "label": "Polish",
        "value": "en"
      }
    ]
  },
  {
    "value": "CON1011",
    "label": "UK",
    "countryCode": "uk",
    "localLanguages": [{
      "label": "English",
      "value": "en"
    }]
  }
];

Код -

arr.map(x => {
  var newObj = Object.keys(x).reduce((obj, key) => {
    if (key !== 'countryID') {
      obj[key] = x[key]
    }

    if (key === 'countryID') {
      obj.value = x.countryID;
    }
  }, {})
  console.log(newObj);

  return newObj;
})

Ответы [ 4 ]

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

Используйте Array.map() для преобразования внешних объектов и другую карту для преобразования localLanguages:

const arr = [{"countryID":"CON1010","countryName":"Poland","countryCode":"pl","localLanguages":[{"language":"English","languageCode":"en"},{"language":"Polish","languageCode":"en"}]},{"countryID":"CON1011","countryName":"UK","countryCode":"uk","localLanguages":[{"language":"English","languageCode":"en"}]}];

const result = arr.map(o => ({
  value: o.countryID,
  label: o.countryName,
  countryCode: o.countryCode,
  localLanguages: o.localLanguages.map(l => ({
    value: l.languageCode,
    label: l.language
  }))
}));

console.log(result)
0 голосов
/ 17 апреля 2020

Вот решение с es6 Destructuring и map:

 const arr = [{"countryID":"CON1010","countryName":"Poland","countryCode":"pl","localLanguages":[{"language":"English","languageCode":"en"},{"language":"Polish","languageCode":"en"}]},{"countryID":"CON1011","countryName":"UK","countryCode":"uk","localLanguages":[{"language":"English","languageCode":"en"}]}];

 const result = arr.map(item => {

  let localLanguages = item.localLanguages.map(i => {
    const { language: label, languageCode: value, ...rest } = i;
    return { label, value, ...rest };
  });

  const { countryID: value, countryName: label, ...rest } = item;

  return { value, label, ...rest, localLanguages };
});

console.log(result)
0 голосов
/ 17 апреля 2020

Здесь функция смены клавиш. Используйте его с каждым элементом массива
рекурсивно, но проверьте тип каждого элемента

function changeKeys(obj) {
  const rename = {
    'countryID': 'value',
    'countryName': 'label',
    'language': 'label',
    'languageCode': 'value'
  }
  return Object.keys(obj)
    .reduce(
    (acc, rec) => {
      if (typeof rename[rec] !== 'undefined') {
        return {...acc, [rename[rec]]: obj[rec]}
      }
      return {...acc, [rec]: obj[rec]}
    }, {}
  )
}
0 голосов
/ 17 апреля 2020

Вы забыли вернуть значение obj в функцию приведения

 var newObj = Object.keys(x).reduce( (obj, key) => {
    if(key !== 'countryID') {
      obj[key] = x[key]
    }

    if(key === 'countryID') {
      obj.value = x.countryID;
    }
  }, {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...