如何“过滤”或以其他方式重组此数据?

时间:2016-05-17 19:31:10

标签: 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":"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
          },
    ]

我通过遍历它并将相关的键/值对推送到输出数组,然后通过输入数据找到了我需要的东西。但是,这只是给了我一系列的价值观。

我可以(虽然我还没有尝试过这个)循环数组并将偶数索引推到“标签”,将奇数推到“值”。我可能最终会这样做,但如果有一种更明智的方法,比如以我所追求的形式构造输出数组,那么我宁愿这样做。

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

但是,我是d3.js的新手,到目前为止,我无法使用我给出的格式生成任何数据

思考?提前谢谢。

[编辑:没有的JSON。]

5 个答案:

答案 0 :(得分:2)

我稍微修改了你的输入对象以获得有效的语法。您可以遍历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);

答案 1 :(得分:0)

我猜你想要这样的东西:

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;

答案 2 :(得分:0)

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

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'
    },
    output = {
        "Variable": "Variable Name",
        values: Object.keys(input.Data).map(function (k) {
            var o = {};
            o[k] = input.Data[k];
            return o;
        })
    };
document.write('<pre>' + JSON.stringify(output, 0, 4) + '</pre>');

答案 3 :(得分:0)

它有点神秘但功能齐全。

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"
},

  Output = [Object.keys(Input).reduce((p,c) => {c == "Variable" ? p[c] = Input[c]
                                                                : c == "Data" &&
                                                                  (p.Values = Object.keys(Input[c])
                                                                                    .reduce((a,k) => a.concat({label : k, value : Input[c][k]}),[]));
                                                return p;},{})];
document.write("<pre>" + JSON.stringify(Output,null,2) + "</pre>");

答案 4 :(得分:-1)

由于dataObject,您可以使用Object.keys(data)获取密钥集合,然后您可以使用data[key]获取每个密钥的值。将其合并到forEach中,您可以做任何您喜欢的事情。