从json对象中提取多维数组。

问题描述 投票:0回答:1

我试图从googlespreadsheet api的json对象中建立一个新的数组。

我得到的结果是这样的。

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'
    }
]

基本上就是去掉子项,然后根据日期重复整个区块。

javascript multidimensional-array
1个回答
1
投票

所以有两点。

  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
投票

你需要修改一下代码 这里是更新后的代码...

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. 子项目数组应该在内循环中形成,主数组在外循环中形成。

  3. 在内循环中形成的子项目数组应附加到主数组的元素上。

    data.subitems = innerdata
    

希望对大家有所帮助。祝你编码愉快!

© www.soinside.com 2019 - 2024. All rights reserved.