как открыть массив объектов на основе имени

#javascript

#javascript

Вопрос:

У меня есть массив с несколькими объектами, имеющими одно и то же имя. Как я могу разделить массив на основе имени?

Я пробовал с map, filter, но ничего не вышло, наконец, я также использовал reduce, но не получил результата.

 const result = Object.values(this.optionsArr.reduce((a, c) => {
        a[c.name] = a[c.name] || {name: c.name};
        a[c.name].options.push(c.options);
        return a;
      }, {})).map(item => ({...item, accessDetails: Object.values(item.accessDetails)}));
  

Ввод:

 [
{name: "audio", options: [
    {name:'true', value: 'T'},
    {name:'false', value: 'F'},
    {name:'yes', value: 'Y'}]
},
{name: "video", options: [
    {name:'true', value: 'T'},
    {name:'false', value: 'F'},
    {name:'yes', value: 'Y'}]
},
{name: "call", options: [
    {name:'true', value: 'T'},
    {name:'false', value: 'F'},
    {name:'yes', value: 'Y'}]
}]
  

Ожидаемый Выход:

 const arr = [{name: "audio", options:{name:'true', value: 'T'}},
{name: "audio", options:{name:'false', value: 'F'}},
{name: "audio", options:{name:'yes', value: 'Y'}},
{name: "video", options:{name:'true', value: 'T'}},
{name: "video", options:{name:'yes', value: 'Y'}},
{name: "video", options:{name:'false', value: 'F'}},
{name: "call", options:{name:'true', value: 'T'}},
{name: "call", options:{name:'No', value: 'N'}},
{name: "call", options:{name:'false', value: 'F'}}];
  

Ответ №1:

Вход представляет собой массив объектов, поэтому array.map:

 let newArray = []
input.map(function(item) {
  item.options.map(function(option) {
    newArray.push({name:item.name, options: option})
  })
})
console.log(newArray);
  

должно работать

Ответ №2:

Да, .reduce это правильный путь, вот способ сделать это:

 const input = [{name: "audio", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]},
    {name: "video", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]},
    {name: "call", options:[{name:'true', value: 'T'},{name:'false', value: 'F'},{name:'yes', value: 'Y'}]}];

const output = input.reduce((acc, cur) => {
  const newEntries = cur.options.reduce((a, c) => ([...a, { ...cur, options: c }]), []);
  return [
      ...acc,
      ...newEntries
    ];
},[]);

console.log(output);  

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

Ответ №3:

Вы должны использовать map для преобразования массива,

 arr = arr.map((element) => {
    const temp = [];
    element.options.forEach(option => {
        temp.push({
            name: element.name,
            options: option
        });
    })
    return temp;
}).flat();
  

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

1. Это приведет к созданию массива массивов, желаемый результат — одноуровневый массив.

2. Понял. Добавление строки в конце выравнивает массив. Обновили ответ.

Ответ №4:

Попробуйте это:

 let output = [];

input.map(item => {
  item.options.forEach(o => {
    output.push({
      name: item.name,
      options: {
        name: o.name,
        value: o.value
      }
    });
  });
});
  

Ответ №5:

Вы можете использовать sort метод и localeCompare .

Попробуйте это:

 arr.sort((a, b) => a.name.localeCompare(b.name))
  

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

1. Это странно, у меня это работает. Он ничего не возвращает? Предполагается, что это даст вам новый массив.