#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. Это странно, у меня это работает. Он ничего не возвращает? Предполагается, что это даст вам новый массив.