JavaScript:转换对象结构

Naz*_*mud 6 javascript jquery

我有一个像这样的对象:

{
  "A": [ "-4927","8779","-9971","-23767" ],
  "B": [ "-10617","-1456","3131","259" ],
  "C": [ "-5185","1168","21501","18989" ],
  "D": [ "2010","5664","2148","-674" ]
}
Run Code Online (Sandbox Code Playgroud)

我想转换成这个:

[
  {
    name: 'A',
    data: ["-4927","8779","-9971","-23767"]
  }, {
    name: 'B',
    data: ["-10617","-1456","3131","259"]
  }, {
    name: 'C',
    data: ["-5185","1168","21501","18989"]
  }, {
    name: 'D',
    data: ["2010","5664","2148","-674"]
  }
]
Run Code Online (Sandbox Code Playgroud)

我使用了以下方法:

var newData = [];
$.each($.parseJSON(data), function(k, v) {
  newData['name'] = k;
  newData['data'] = v;
});
Run Code Online (Sandbox Code Playgroud)

但它只将最后一个密钥对值存储为newData.那是

name: 'D',
data: ["2010","5664","2148","-674"]
Run Code Online (Sandbox Code Playgroud)

据我所知,它会覆盖以前的数据并仅存储它获得的最后数据.但我无法解决这个问题.

任何帮助?

小智 8

您正在分配属性name而不是data直接newData将对象作为数组推入其中:

将你的循环改为:

var newData = [];
$.each($.parseJSON(data), function(k, v) {
        const myNewData = {
            name: k,
            data: v
        }
        newData.push(myNewData);
});
Run Code Online (Sandbox Code Playgroud)


Tha*_*you 5

你可以使用 map

const oldData =
  { "A": [ "-4927","8779","-9971","-23767" ]
  , "B": [ "-10617","-1456","3131","259" ]
  , "C": [ "-5185","1168","21501","18989" ]
  , "D": [ "2010","5664","2148","-674" ]
  }

const newShape = ([ name, data ]) =>
  ({ name, data })

const newData =
  Object.entries(oldData).map(newShape)

console.log(newData)
// [ { name: "A", data: [ "-4927","8779","-9971","-23767" ] }, ... ]
Run Code Online (Sandbox Code Playgroud)

如果愿意,你可以编写lambda内联,但通常用可重用的部分编写程序会更好

const newData =
  Object.entries(oldData).map(([ name, data ]) => ({ name, data }))
Run Code Online (Sandbox Code Playgroud)

jQuery可以使用$ .map映射对象- 注意不同的lambda

const newData =
  $.map(oldData, (data, name) => ({ name, data }))
Run Code Online (Sandbox Code Playgroud)