У меня есть массив объектов
[
{"id":"brand","label":"Brand","value":"value1"},
{"id":"waterproof","label":"Waterproof","value":"value1"},
{"id":"diameter","label":"Diameter","value":""},
{"id":"brand","label":"Brand","value":"value2"},
{"id":"waterproof","label":"Waterproof","value":"value2"},
{"id":"diameter","label":"Diameter","value":""}
]
Мне нужно перестроить его в следующую структуру,
[
["Brand", "value1", "value2"],
["Waterproof", "value1","value2"],
["Diameter","",""]
]
Любые идеи о том, как я могу это сделать, используя метод уменьшения.
Лучший
Всего 6 ответов
Попробуйте выполнить команду Array.reduce и Object.values
let arr = [{"id":"brand","label":"Brand","value":"value1"},{"id":"waterproof","label":"Waterproof","value":"value1"},{"id":"diameter","label":"Diameter","value":""},{"id":"brand","label":"Brand","value":"value2"},{"id":"waterproof","label":"Waterproof","value":"value2"},{"id":"diameter","label":"Diameter","value":""}]; let result = Object.values(arr.reduce((a,c) => { if(a[c.id]) a[c.id].push(c.value); else a[c.id] = [c.label, c.value]; return a; }, {})); console.log(result);
Юст возьмите Map
и соберите все значения.
var json = '[{"id":"brand","label":"Brand","value":"value1"},{"id":"waterproof","label":"Waterproof","value":"value1"},{"id":"diameter","label":"Diameter","value":""},{"id":"brand","label":"Brand","value":"value2"},{"id":"waterproof","label":"Waterproof","value":"value2"},{"id":"diameter","label":"Diameter","value":""}]', result = Array.from(JSON .parse(json) .reduce((m, { id, label, value }) => m.set(id, (m.get(id) || [label]).concat(value)), new Map) .values() ); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Не лучший код, но я думаю, что это может быть полезно для вас:
let data = [
{"id":"brand","label":"Brand","value":"value1"},
{"id":"waterproof","label":"Waterproof","value":"value1"},
{"id":"diameter","label":"Diameter","value":""},
{"id":"brand","label":"Brand","value":"value2"},
{"id":"waterproof","label":"Waterproof","value":"value2"},
{"id":"diameter","label":"Diameter","value":""}
]
let reducedData = {}
data.forEach((row)=>{
reducedData[row.id] ? reducedData[row.id].push(row.value) : reducedData[row.id] = [row.label, row.value]
})
let newData = Object.keys(reducedData).map((id)=>{return [...reducedData[id]]})
Вы также можете использовать простую комбинацию Array.prototype.reduce
и Object.keys
:
const data = [{"id":"brand","label":"Brand","value":"value1"},{"id":"waterproof","label":"Waterproof","value":"value1"},{"id":"diameter","label":"Diameter","value":""},{"id":"brand","label":"Brand","value":"value2"},{"id":"waterproof","label":"Waterproof","value":"value2"},{"id":"diameter","label":"Diameter","value":""}]; const grouped = data.reduce((o, { label, value }) => ({...o, [label]: [...(o[label] || []), value]}), {}); const result = Object.keys(grouped).map(label => [label, ...grouped[label]]); console.log(result);
Здесь я использую Set для создания уникального списка id
, а затем я map
для создания настраиваемого массива на основе этих id
. Это делается с помощью find для получения метки и фильтра, чтобы получить все элементы, связанные с id
. Я снова сопоставляю фильтр, чтобы просто вернуть value
объекта.
let items = [ {"id":"brand","label":"Brand","value":"value1"}, {"id":"waterproof","label":"Waterproof","value":"value1"}, {"id":"diameter","label":"Diameter","value":""}, {"id":"brand","label":"Brand","value":"value2"}, {"id":"waterproof","label":"Waterproof","value":"value2"}, {"id":"diameter","label":"Diameter","value":""} ] let result = [...new Set(items.map(i => i.id))] .map(id => { return [ items.find(i => i.id == id).label, ...items.filter(i => i.id == id).map(i => i.value) ] }) console.log(result)
Если массив JSON очень длинный из некоторого API
var data = [
{"id":"brand","label":"Brand","value":"value1"},
{"id":"waterproof","label":"Waterproof","value":"value1"},
...... //some JSON array form some API
];
var json = JSON.stringify(data);
result = Array.from(JSON
.parse(json)
.reduce((m, { id, label, value }) => m.set(id, (m.get(id) || [label]).concat(value)), new Map)
.values()
);
console.log(result);