Создание массива объектов из массива массивов, где ключ зависит как от типа данных элемента массива

#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));