转换数组数据的问题

时间:2019-11-22 15:59:40

标签: arrays google-apps-script data-structures

我正在尝试转换以下JSON数组数据结构-

来自

[
  {
    "date": "2019-01-01",
    "marks": [
      {
        "quantity": {
          "shoes": 1,
          "belt": 2,
          "socks": 3
        }
      }
    ]
  },
  {
    "date": "2019-01-02",
    "marks": [
      {
        "quantity": {
          "shoes": 4,
          "belt": 5,
          "socks": 6
        }
      }
    ]
  }
]

To

rows: [
  {
    values: [ '2019-01-01', 1, 2, 3]
  },
  {
    values: [ '2019-01-02', 4, 5, 6]
  }
]

到目前为止,我可以尝试的代码是-

function myFunction() {
  var response = [
    {
      "date": "2019-01-01",
      "marks": [
        {
          "quantity": {
            "shoes": 1,
            "belt": 2,
            "socks": 3
          }
        }
      ]
    },
    {
      "date": "2019-01-02",
      "marks": [
        {
          "quantity": {
            "shoes": 4,
            "belt": 5,
            "socks": 6
          }
        }
      ]
    }
  ];
  var transform = response.map(function(dailyMarks) {
    var row = [];
    Object.keys(response).asArray().forEach(function (field) {
      switch (field) {
        case 'shoes':
          return row.push(dailyMarks.shoes);
        case 'belt':
          return row.push(dailyMarks.belt);
        case 'socks':
          return row.push(dailyMarks.socks);
        case 'date':
          return row.push(dailyMarks.date);
        default:
          return row.push('');
      }
    });
    return { values: row };
  });
  Logger.log(transform);
}

但是,我遇到了这个错误-

  

TypeError:在对象1,2中找不到函数asArray。 (第XX行,文件“代码”)

可以肯定我做错了什么,但还无法弄清哪里。

目标只是改变上述数据结构-方法并不重要。

任何帮助将不胜感激!谢谢。

4 个答案:

答案 0 :(得分:3)

在ES5中,

var arr1 = [
  {
    date: '2019-01-01',
    marks: [
      {
        quantity: {
          shoes: 1,
          belt: 2,
          socks: 3,
        },
      },
    ],
  },
  {
    date: '2019-01-02',
    marks: [
      {
        quantity: {
          shoes: 4,
          belt: 5,
          socks: 6,
        },
      },
    ],
  },
];
var out = [];
arr1.forEach(function(obj) {
  obj.marks.forEach(function(mark) {
    out.push({
      values: [obj.date].concat(
        Object.keys(mark.quantity).map(function(key) {
          return mark.quantity[key];
        })
      ),
    });
  });
});
console.log({ rows: out });
 

答案 1 :(得分:0)

您可以为订单取一个键数组,然后对marks数组进行平面映射。

EXPOSE 8080
var data = [{ date: "2019-01-01", marks: [{ quantity: { shoes: 1, belt: 2, socks: 3 } }] }, { date: "2019-01-02", marks: [{ quantity: { shoes: 4, belt: 5, socks: 6 } }] }],
    keys = ['shoes', 'belt', 'socks'],
    rows = data.map(({ date, marks }) =>
        ({ values: [date, ...marks.flatMap(({ quantity }) => keys.map(k => quantity[k]))] })),
    result = { rows };

console.log(result);

答案 2 :(得分:0)

var list=[{"date":"2019-01-01","marks":[{"quantity":{"shoes":1,"belt":2,"socks":3}}]},{"date":"2019-01-02","marks":[{"quantity":{"shoes":4,"belt":5,"socks":6}}]}];

let result = list.map(( {date, marks} ) => { return {value: [date, ...Object.values(marks[0].quantity)]};});
let wrap = {rows: result};
console.log(wrap);

答案 3 :(得分:0)


let x = products.map(p=>{
     return p.marks.reduce((t,m)=>{
        t.push({ values: [p.date, ...Object.entries(m.quantity).map(([key, value]) => value)]})
        return t;
      },[])
  }
).flat(2)

console.log(x)