Формирование массивов из объектов
Существует объект вида:
{
"01.09.2020": Object { "name1": 24, "name2": 14 }
"02.09.2020": Object { "name1": 29, "name2": 10 }
"03.09.2020": Object { "name1": 22, "name3": 1, "name2": 9 }
"04.09.2020": Object { "name2": 5 }
"05.09.2020": Object { "name1": 19, "name2": 5 }
}
Объект Object { "name1": 24, "name2": 14 } - может содержать различное количество и любое имя (name2) параметраов
Как бы так из него сделать, средствами jquery набор массивов
[
[24, 29, 22, 0, 19],
[14, 10, 9, 5, 5],
[0, 0, 1, 0, 0]
]
То есть каждый массив должен соответствовать набору (name ов), если в объекте на какое либо число какой либо параметр отсутствует, то в массив ставиться 0 т.е [0, 0, 1, 0, 0] - Порядок чисел в массивах соответствует количеству и порядку дат.
Ответы (2 шт):
Все очень просто, перебираем с помощью двух циклов данный объект и записываем результат в новый. Для того, чтобы получить номер, я обрезаю первых четыре символа, в случае, если вместо "name" будет другое слово, можно использовать replace.
const obj = {
"01.09.2020": { "name1": 24, "name2": 14 },
"02.09.2020": { "name1": 29, "name2": 10 },
"03.09.2020": { "name1": 22, "name3": 1, "name2": 9 },
"04.09.2020": { "name2": 5 },
"05.09.2020": { "name1": 19, "name2": 5 }
};
const result = [];
for(let date in obj ){
for(let name in obj[date]){
const nameNumber = name.substring(4);
if(!result[nameNumber]){
result[nameNumber] = [];
}
result[nameNumber].push(obj[date][name]);
}
}
console.log(result);
Кстати, в вышеуказанном фрагменте первый элемент массива будет как undefined, так как массив начинается с "0", а ключи с "1". Если это проблема, можно исправить следующей строкой:
result.shift();
Обновление 1:
const obj = {
"01.09.2020": { "name1": 24, "name2": 14 },
"02.09.2020": { "name1": 29, "name2": 10 },
"03.09.2020": { "name1": 22, "name3": 1, "name2": 9 },
"04.09.2020": { "name2": 5 },
"05.09.2020": { "name1": 19, "name2": 5 }
};
const result = {};
for(let date in obj ){
for(let name in obj[date]){
if(!result[name]){
result[name] = [];
}
result[name].push(obj[date][name]);
}
}
console.log(Object.values(result));
Решить задачу можно за один проход, для этого достаточно учитывать номер имен, и при появлении нового имени сразу добавлять массив заполненный нулями. Длина массива заранее известна и соответствует количеству дней.
Далее достаточно устанавливать значение по нужному индексу.
Пример реализации:
const obj = {
"01.09.2020": {
"name1": 24,
"name2": 14
},
"02.09.2020": {
"name1": 29,
"name2": 10
},
"03.09.2020": {
"name1": 22,
"name3": 1,
"name2": 9
},
"04.09.2020": {
"name2": 5
},
"05.09.2020": {
"name1": 19,
"name2": 5
}
};
var result = Object.values(obj).reduce((acc, cur, index, arr) =>
Object.entries(cur).reduce(({
map,
res
}, [key, val]) => {
if (!map.has(key)) {
var counter = map.size;
res[counter] = new Array(arr.length).fill(0);
map.set(key, counter);
}
res[map.get(key)][index] = val;
return {
map,
res
};
}, acc), {
map: new Map(),
res: []
}).res;
console.log(Object.values(result));