Javascript “我该怎么做?”;“过滤器”;或者以其他方式重新构造此数据?

Javascript “我该怎么做?”;“过滤器”;或者以其他方式重新构造此数据?,javascript,arrays,d3.js,nvd3.js,Javascript,Arrays,D3.js,Nvd3.js,我有一些表格数据: var Input = { "Variable": "Variable Name", "Data": { "key_1": value_1, "key_2": value_2, "key_3": value_3, "key_4": value_4, "key_5": value_5, }, "Omega": value }; 我要做的是将其重构为以下形式: var Output = [ { "variable":"va

我有一些表格数据:

var Input = {
"Variable": "Variable Name",
  "Data": {
    "key_1": value_1,
    "key_2": value_2,
    "key_3": value_3,
    "key_4": value_4,
    "key_5": value_5,
  },
"Omega": value
};
我要做的是将其重构为以下形式:

var Output = [
{
    "variable":"variable name",
    values:[
          {
              "label":"key_1",
              "value": value_1
          },
          {
              "label":"key_2",
              "value": value_2
          },
          {
              "label":"key_1",
              "value": value_1
          },
          {
              "label":"key_3",
              "value": value_3
          },
          {
              "label":"key_4",
              "value": value_4
          },
          {
              "label":"key_5",
              "value": value_5
          },
    ]
我通过循环输入数据并将相关的键/值对推送到输出数组中,从中找到了所需的内容。但是,这只是给了我一个值数组

我可以(尽管我还没有尝试过)循环遍历数组,将偶数索引推到“label”,将奇数索引推到“value”。我可能最终会这样做,但如果有更明智的方法,比如按照我想要的形式构造输出数组,那么我宁愿这样做

我最终要做的是在D3.js或NVD3.js中生成一个条形图,其中键作为标签,值作为条形图的高度

但是,我对d3.js还不熟悉,到目前为止,我无法使用给定格式的数据生成任何内容

想法?提前谢谢


[已编辑:未编辑的JSON.]

我稍微修改了您的输入对象,使其具有有效的语法。您可以循环使用
Input.Data
的键来填充
output.values
数组

var input = {
"Variable": "Variable Name",
  "Data": {
    "key_1": 1,
    "key_2": 2,
    "key_3": 3,
    "key_4": 4,
    "key_5": 5,
  },
"Omega": 'ohm'
};

var output = {};
output.variable = input.Variable;
output.values = [];

for (var name in input.Data) {
  if (!input.Data.hasOwnProperty(name)) continue;
  output.values.push({label: name, value: input.Data[name]});
}

console.log(output);

由于
数据
是一个
对象
,因此可以使用
对象.keys(数据)
获取密钥集合,然后可以使用
数据[key]
获取每个密钥的值。将此功能整合到一个
forEach
中,您可以做任何您喜欢的事情。

我想您需要这样的功能:

var Input = {
"Variable": "Variable Name",
  "Data": {
    "key_1": 1,
    "key_2": 2,
    "key_3": 3,
    "key_4": 4,
    "key_5": 5,
  },
"Omega": 6
};

Input.values = Object.keys(Input.Data).map(function(item){ return { "label": item, "value": Input.Data[item] } });
delete Input.Data;

您可以在键上使用循环,并返回包含所需内容的新对象

var输入={
“变量”:“变量名”,
“数据”:{
“键1”:“值1”,
“键2”:“值2”,
“键3”:“值3”,
“键4”:“值4”,
“键5”:“值5”,
},
“欧米茄”:“价值”
},
输出={
“变量”:“变量名”,
值:对象。键(输入。数据)。映射(函数(k){
var o={};
o[k]=输入数据[k];
返回o;
})
};

document.write(“”+JSON.stringify(输出,0,4)+“”)它有点神秘,但功能齐全

var输入={
“变量”:“变量名”,
“数据”:{
“键1”:“值1”,
“键2”:“值2”,
“键3”:“值3”,
“键4”:“值4”,
“键5”:“值5”,
},
“欧米茄”:“价值”
},
输出=[Object.keys(Input).reduce((p,c)=>{c==“变量”?p[c]=Input[c]
:c==“数据”&&
(p.Values=Object.keys(输入[c])
.reduce((a,k)=>a.concat({label:k,value:Input[c][k]}),[]);
返回p;},{})];

write(“+JSON.stringify(Output,null,2)+”)值数组中项目的顺序是否重要?您如何处理
Omega
?从输出中包括或排除?D3.js的可能副本有适当的方法:,尽管它返回的数据格式稍有不同(
{key,value}
,而不是
{label,value}
)。Omega可以包含在json中其他数据的另一个图形中。Cryptic是正确的。。。不过,如果输出中的“值”不在引号中,它也可以工作。我正在努力解决这个问题。如果你有什么建议,请扔给我。价值观才是关键。这是否真的很重要,如果它在引用或不。。?您可以像
输出[0]一样访问它。值