#javascript #arrays #json #object #key-value
#javascript #массивы #json #объект #ключ-значение
Вопрос:
У меня есть массив массивов this.rowDataOfAllGrids, который приводит к созданию нескольких массивов со структурой, подобной:
[
[123,"Hello", 3455],
[456, "Blue Falcon", 53],
[20, "Yellow Apple", 134]
.... (this could contain hundreds of arrays)
]
В итоге, массивы, в которых 1 элемент является строкой, а остальные — значениями.
Я пытаюсь создать объект, используя this.rowDataOfAllGrids, где независимо от того, где находится строка (с точки зрения порядка элементов), она присваивается ключевой категории, а остальные присваиваются ключевым series_1, series_2 в зависимости от их порядка. Итак, что-то вроде so на основе this.rowDataOfAllGrids выше:
[{
series_1: 123,
category: "Hello"
series_2: 3455
}
{
series_1: 456,
category: "Blue Falcon"
series_2: 53
}
{
series_1: 20,
category: "Yellow Apple"
series_2: 134
}]
Вот что у меня есть на данный момент:
createObjectFromArray() {
var gridRowDataLength = this.rowDataOfAllGrids.reduce((accumulator, value) => value.length, 0);
for (var i = 1; i<=gridRowDataLength-1; i ) {
let valueVariables = "series_" (i);
this.arrayOfValuesToUseAsKeys.push(valueVariables);
}
// this creates the object where we get the first value, assign it to category and assign the rest to series_# depending on the order.
this.objectFromArray = this.rowDataOfAllGrids.map(
([category, ...rest]) => Object.fromEntries([
['category', category],
...rest.map((series, i) => ['series_' (i 1), value])
])
);
},
Это работает, если массивы имеют формат [«Yo», 2, 53 3455], где элемент, представляющий собой строку, находится слева от всех остальных элементов. Однако в приведенном выше примере это не работает.
Однако это не работает в случаях, когда в левой части строки есть какое-либо число, потому что мы берем первый элемент и присваиваем ему категорию, а остальным series_# .
Порядок правильный с точки зрения каждого элемента, которому присваивается номер series_1, series_2 и т. Д. В зависимости от их порядка, Однако я не уверен, как изменить это, чтобы учесть, находится ли строка где-то еще в массиве.
Моим следующим шагом будет что-то вроде извлечения строки из массива в зависимости от его типа данных. Затем снова объедините его, чтобы он был в начале. Хорошая ли это идея, и если нет, что было бы хорошим процессом?
Комментарии:
1. У вас не может быть двух
series_1
ключей в одном объекте, это опечатка?2. К вашему сведению, ваша
gridRowDataLength
переменная — это просто длина последней строки. Зачем использовать цикл для этого, а не простоthis.rowDataOfAllGrids[this.rowDataOfAllGrids.length-1].length
?
Ответ №1:
Перебирайте элементы строки, проверяя тип. Если это строка, присвойте ее category
свойству, в противном случае присвойте ее следующему series_X
свойству.
const rowDataOfAllGrids = [
["Hello", 123,3455],
[456, "Blue Falcon", 53],
[20, 134, "Yellow Apple"]
];
let result = rowDataOfAllGrids.map(row => {
let obj = {};
let i = 1;
row.forEach(el => {
if (typeof el == "string") {
obj.category = el;
} else {
obj["series_" i ] = el;
}
});
return obj;
});
console.log(result);
Комментарии:
1. Это работает очень хорошо, в дополнение к вопросу, не знаете ли вы, как получить массив всех ключей, которые начинаются с series_ ? Ранее у меня была переменная (выше) this.arrayOfValuesToUseAsKeys, но из-за того, что это написано более кратко, я не уверен, как воссоздать эту переменную
2. Зачем вам это нужно? Вы уверены, что вам нужно, чтобы они были в отдельных свойствах, а не в одном свойстве, значением которого является массив?
3. Это связано с библиотекой, которую я использую для отображения диаграмм. Мне нужно присвоить этот массив другой переменной, поэтому, в частности, у меня есть xKey и yKey. Предполагается, что yKey представляет собой массив всех ключей, которые не являются категорией
4. Затем вы можете сделать это так же, как вы делаете это в своем коде. Просто вычтите 1 из длины строк.
Ответ №2:
const gridData = [
[123, "Hello", 3455],
[456, "Blue Falcon", 53],
[20, "Yellow Apple", 134]
]
const res = gridData.map(item => {
let count = 1
let temp = {}
item.forEach(it => {
if (typeof it === 'string') {
temp.category = it
} else {
temp[`series_${count }`] = it
}
})
return temp;
})
console.log(res)
Ответ №3:
const data = [
[123,"Hello", 3455],
["Blue Falcon", 456, 53],
[20, 134, "Yellow Apple"]
];
const transform = arr => arr.map((e) => {
let series = 1;
return e.reduce((o, ee) => {
if (typeof ee === 'string') {
o.category = ee;
} else {
o[`series_${series }`] = ee;
}
return o;
}, {});
});
console.log(transform(data));