Как из вложенного массива сделать массив объектов по некоторым правилам
Помогите новичку разобраться) Есть вложенный массив данных:
const data = [['name1','name2'], [2345, 765], [2005, 2301], [1000, 1001], [0.0045, 0.0078], [0.03, 0.02], [0.15, 0.16]]
Посути это таблица Excel, где data[0] - названия, data[1...3] - координаты Y, data[4...6] - координаты X для этих названий. Необходимо получить в итоге массив из 6ти объектов, в которых каждому элементу в data[0] будет соотвествовать 3 раза по 2 пары координат для этих элементов, такого вида:
const result = [
{
name: 'name1'
data: {
x: 0.0045,
y: 2345
}
},
{
name: 'name2'
data: {
x: 0.0078,
y: 765,
}
},
{
name: 'name1'
data: {
x: 0.03,
y: 2005,
}
},
{
name: 'name2'
data: {
x: 0.02,
y: 2301,
}
},
{
name: 'name1'
data: {
x: 0.15,
y: 1000,
}
},
{
name: 'name2'
data: {
x: 0.16,
y: 1001,
}
},
]
Пробовал таким методом:
const data = [['name1','name2'], [2345, 765], [2005, 2301], [1000, 1001], [0.0045, 0.0078], [0.03, 0.02], [0.15, 0.16]];
const t1 = data[0].map((item, index) => {
let obj = {};
obj.name = item;
obj.data = {};
obj.data.x = data[4][index];
obj.data.y = data[1][index];
return obj;
})
const t2 = data[0].map((item, index) => {
let obj = {};
obj.name = item;
obj.data = {};
obj.data.x = data[5][index];
obj.data.y = data[2][index];
return obj;
})
const t3 = data[0].map((item, index) => {
let obj = {};
obj.name = item;
obj.data = {};
obj.data.x = data[6][index];
obj.data.y = data[3][index];
return obj;
})
const result = [...t1, ...t2, ...t3]
Результат получается, но я никак не учитываю, что первоначальный массив data может быть разной величины, где набор координат может быть намного больше или меньше и повторяю по-сути один и тот же код несколько раз. Вопрос: Как получить нужный результат одним проходом через map(или любым другим способом), учитывая что первоначальный массив дата может иметь разную длину, с разным набором пар координат для каждого из элементов в data[0]? спасибо!)
Ответы (1 шт):
Если я правильно понял, то наименований может быть много. Первая половина массива - это игреки, вторая половина массива - иксы. Тогда вот такой алгоритм:
const data = [['name1','name2'], [2345, 765], [2005, 2301], [1000, 1001], [0.0045, 0.0078], [0.03, 0.02], [0.15, 0.16]];
// Первый элемент массива - это массив наименований
const names = data.shift();
// Оставшийся массив делим пополам на иксы и игреки
const xs = data.splice(Math.floor(data.length / 2));
// игреки остаются в data, копируем в ys чисто для наглядности
const ys = data;
const result = [];
// перебираем в цикле от 0 до размера xs или ys (они одинаковы по условию задачи)
for (let i=0; i < xs.length; i++) {
// в каждой итерации перебираем массив наименований, получая наименование и индекс
names.forEach((name, n) => {
// добавляем в результат полученный объект
result.push({
name: name,
data: {
x: xs[i][n],
y: ys[i][n],
}
});
});
}
console.log(result);