многомерный массив из json объектов - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь создать новый массив из json объектов, взятых из api googlespreadsheet.

Я получаю следующее:

valueRanges:
    0:
        values:
            0:
              0: Tuesday May 12
            1: 
              0: ''
              1: ''
              2: ''
              3: 'Person 1' 
              4: 'Person 2'
            2:
              0: '00:00'
              1: 'till'
              2: '01:00'
              3: 'name 1'
              4: 'name 2'
            3:
              0: '01:00'
              1: 'till'
              2: '02:00'
              3: 'another name 1'
              4: 'another name 2'
            4:
              ...
    1:
        values:
            0:
              .....

Что бы я хотел новый массив должен выглядеть так:

[{
    date: 'Tuesday May 12, 
    header: true,
    subitems: [{
        0: {
           time: '',
           person1: 'Person 1',
           person2: 'Person 2'
        }
        1: {
           time: '00:00 till 01:00',
           person1: 'Name 1',
           person2: 'Name 2'
        }
        2: {
           time: '01:00 till 02:00',
           person1: 'Another Name 1',
           person2: 'Another Name 2'
        }
    }]
}]

Я знаю, как получить время от 3 столбцов до 1 строки, так что проблема не в этом.

Код, который я сейчас использую для создать массив следующим образом:

fetch(url)
    .then((response) => response.json())
    .then((response) => {
        const data = [];
        for (let i = 0; i < response.valueRanges.length; i++) {
            const data = [{
                'date': response.valueRanges[i].values[0][0],
                'header':true,
            }];
            for (let j = 0; j < response.valueRanges[i].values.length; j++) {
                if (j == 0) {
                    continue;
                }
                const time = [response.valueRanges[i].values[j][0],response.valueRanges[i].values[j][1],response.valueRanges[i].values[j][2]];
                const array2 = [
                    {
                        'subitems': {
                            'time': time.join(' '),
                            'person1': response.valueRanges[i].values[j][3],
                            'person2':response.valueRanges[i].values[j][4]
                        }
                    }
                ]
            }
            data.push(array2);
        }

Но я не получаю правильный массив.

Отредактировано

Вот что я получаю:

[ { date: 'Tuesday May 12', header: true } ]
[ { subitems: { time: '', person1: 'Persoon 1', person2: 'Persoon 2' } } ]
[ { subitems: 
     { time: '00:00 tot 01:00',
       person1: 'Name 1',
       person2: 'Name 2' } } ]
[ { subitems: 
     { time: '01:00 tot 02:00',
       person1: 'Another name 1',
       person2: 'Another name 2' } } ]

Что я пропустил?

Дополнительный вопрос

А что, если я хочу вместо этого изменить новый массив на следующее:

[
    {
        date: 'Tuesday May 12, 
        header: true
    }
    {
        time: '',
        person1: 'Person 1',
        person2: 'Person 2'
    }
    {
        time: '00:00 till 01:00',
        person1: 'Name 1',
        person2: 'Name 2'
    }
    {
        time: '01:00 till 02:00',
        person1: 'Another Name 1',
        person2: 'Another Name 2'
    }
]

Итак, в основном удаляем подэлементы и просто повторяем весь блок в зависимости от дат.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Итак, две точки:

  1. Вы объявили два массива данных. Я не уверен, для чего нужен первый, поэтому удалил его.
  2. Некоторые элементы представляют собой массивы, которые должны быть простыми объектами или наоборот, поэтому я изменил это.
    fetch(url)
        .then((response) => response.json())
        .then((response) => {
            for (let i = 0; i < response.valueRanges.length; i++) {
                const data = {
                    date: response.valueRanges[i].values[0][0],
                    header: true,
                    subitems: []
                };
                for (let j = 0; j < response.valueRanges[i].values.length; j++) {
                    if (j == 0) {
                        continue;
                    }
                    const time = [response.valueRanges[i].values[j][0],response.valueRanges[i].values[j][1],response.valueRanges[i].values[j][2]];
                    const subitem = {
                         time: time.join(' '),
                         person1: response.valueRanges[i].values[j][3],
                         person2: response.valueRanges[i].values[j][4]
                    };
                    data.subitems.push(subitem);
                }
            }

Объект с массивом subitems теперь хранится в data.

Дополнительный вопрос:

    fetch(url)
        .then((response) => response.json())
        .then((response) => {
            for (let i = 0; i < response.valueRanges.length; i++) {
                const data = [];
                data.push({
                    date: response.valueRanges[i].values[0][0],
                    header: true
                });
                for (let j = 0; j < response.valueRanges[i].values.length; j++) {
                    if (j == 0) {
                        continue;
                    }
                    const time = [response.valueRanges[i].values[j][0],response.valueRanges[i].values[j][1],response.valueRanges[i].values[j][2]];
                    const subitem = {
                         time: time.join(' '),
                         person1: response.valueRanges[i].values[j][3],
                         person2: response.valueRanges[i].values[j][4]
                    };
                    data.push(subitem);
                }
            }
0 голосов
/ 06 мая 2020

Вам нужно немного изменить код. Вот обновленный код ..

const outerdata = [];
const innerdata = [];
for (let i = 0; i < response.valueRanges.length; i++) {
    const data = [{
        'date': response.valueRanges[i].values[0][0],
        'header':true,
        'subitems': []
    }];
    for (let j = 0; j < response.valueRanges[i].values.length; j++) {
        if (j == 0) {
            continue;
        }
        const time = [response.valueRanges[i].values[j][0],response.valueRanges[i].values[j][1],response.valueRanges[i].values[j][2]];
        const subitems = {
            'time': time.join(' '),
            'person1': response.valueRanges[i].values[j][3],
            'person2':response.valueRanges[i].values[j][4]
        }
        innerdata.push(subitems);
    }
    data.subitems = innerdata
    outerdata.push(data);
}

Быстрый обзор внесенных мной изменений:

  1. Объявлены 2 массива для хранения основного массива и массивов внутренних подэлементов соответственно.

    const outerdata = [];
    const innerdata = [];
    
  2. массив подэлементов должен быть сформирован внутри внутреннего l oop и основного массива внутри внешнего l oop

  3. Массив subitems, сформированный во внутреннем l oop, должен быть добавлен к элементу основного массива

    data.subitems = innerdata
    

Надеюсь, это поможет. Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...