Javascript: Проверьте, существует ли дубликат ключа, добавьте соответствующие дочерние элементы для дубликата ключа

#javascript

Вопрос:

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

 const arr = [
    {label: 'id', key: 'wfc_id'},
    {label: 'Name', key: 'wfc_name'},
    {label: 'Age', key: 'wfc_age'},
    {label: 'id', key: 'ga_id'},
    {label: 'Name', key: 'ga_name'},
    {label: 'Age', key: 'ga_age'},
    {label: 'Name', key: 'rtc_name'},
    {label: 'id', key: 'rtc_id'},
]

Desired Ouput:
output = {
    wfc: {id:true, name:true, age: true},
    ga: {id:true, name:true, age: true},
    rtc: {id:true, name:true},
}
 

Я попытался выполнить следующий код:

 let output = Object.assign({},arr.map((item) => {
    let str = item.key.split('_');
    let obj = {};
    obj[str[0]] = {
        [str[1]]: true
    }
    return obj
})
);
console.log(output);
 

Но это дает мне такой результат, как

 {
  "0": {
    "wfc": {
      "id": true
    }
  },
  "1": {
    "wfc": {
      "name": true
    }
  },
  "2": {
    "wfc": {
      "age": true
    }
  },
  "3": {
    "ga": {
      "id": true
    }
  },
  "4": {
    "ga": {
      "name": true
    }
  },
  "5": {
    "ga": {
      "age": true
    }
  },
 .......
}
 

Я требую, чтобы если ключ уже вышел, то добавьте массив/объект для соответствующего ключа

Ответ №1:

Функция map() возвращает новый массив. Чтобы преобразовать вывод, вам нужно уменьшить(), также называемую «сгибом».

 arr.reduce((acc, curr) => {
  const split = curr.key.split('_');
  const identifier = split[0];
  const property = split[1];
  acc[identifier] = { ...acc[identifier], [property]: true };
  return acc;
}, {});
 

Ответ №2:

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

 const arr = [
  {label: 'id', key: 'wfc_id'},
  {label: 'Name', key: 'wfc_name'},
  {label: 'Age', key: 'wfc_age'},
  {label: 'id', key: 'ga_id'},
  {label: 'Name', key: 'ga_name'},
  {label: 'Age', key: 'ga_age'},
  {label: 'Name', key: 'rtc_name'},
  {label: 'id', key: 'rtc_id'},
]

const output = arr.reduce((acc, item) => {

  // Destructure the array into a key and value
  let [ key, value ] = item.key.split('_');

  // If the key doesn't exist on the accumulator
  // add an empty object
  acc[key] = acc[key] || {};

  // And then set the object property to true
  acc[key][value] = true;

  // Return the accumulator for the next iteration
  return acc;
}, {});

console.log(output); 

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

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

Ответ №3:

Вы можете использовать сокращение для вашего случая.

 const arr = [
  { label: "id", key: "wfc_id" },
  { label: "Name", key: "wfc_name" },
  { label: "Age", key: "wfc_age" },
  { label: "id", key: "ga_id" },
  { label: "Name", key: "ga_name" },
  { label: "Age", key: "ga_age" },
  { label: "Name", key: "rtc_name" },
  { label: "id", key: "rtc_id" },
];

const o = arr.reduce((a, b) => {
  const [key, prop] = b.key.split("_");
  a[key] ? (a[key][prop] = true) : (a[key] = { [prop]: true });
  return a;
}, {});

console.log(o);