使用map / reduce格式化数据集

时间:2016-12-06 19:50:04

标签: javascript arrays object

以下是我的数据集和我想要的内容。 任何人都可以建议我如何将我的datatset格式化为我想要的东西吗? FIDDLE HERE(在浏览器中使用控制台)

我做了一个尝试(下面),这是一个接近但不是我想要的。

这是我的数据集

data_p = [
[{"key":"Device_Model","value":"test_model"},
{"key":">20MB/30","value":"11"},
{"key":">200MB/30","value":"33"},
{"key":">2048MB/30","value":"10"},
{"key":">5120MB/30","value":"55"},
{"key":">10240MB/30","value":"10"}
],
[{"key":"Device_Model","value":"0P6B670"},
{"key":">20MB/30","value":"9"},
{"key":">200MB/30","value":"8"},
{"key":">2048MB/30","value":"2"},
{"key":">5120MB/30","value":"23"},
{"key":">10240MB/30","value":"23"}]]

这就是我想要的

[{
    "name": ">20MB/30",
    "values": [{
      "key": "test_model",
      "value": 11
    }, {
      "key": "0P6B670",
      "value": 9
    }]
  },

  {
    "name": ">200MB/30",
    "values": [{
      "key": "test_model",
      "value": 33
    }, {
      "key": "0P6B670",
      "value": 8
    }]
  },

  {
    "name": ">2048MB/30",
    "values": [{
      "key": "test_model",
      "value": 10
    }, {
      "key": "0P6B670",
      "value": 2
    }]
  },

  {
    "name": ">5120MB/30",
    "values": [{
      "key": "test_model",
      "value": 55
    }, {
      "key": "0P6B670",
      "value": 23
    }]
  },

  {
    "name": ">10240MB/30",
    "values": [{
      "key": "test_model",
      "value": 10
    }, {
      "key": "0P6B670",
      "value": 23
    }]
  }
]

这是我的尝试

bars = color.domain().map(function(name){
    return {
        name: name,
        values: data_p.reduce(function(d) {
            return d.slice(1)
            })  
    }
});

它给了我这个:

"[{"name":">20MB/30","values":[{"key":">20MB/30","value":11},{"key":">200MB/30","value":33},{"key":">2048MB/30","value":10},{"key":">5120MB/30","value":55},{"key":">10240MB/30","value":10}]},{"name":">200MB/30","values":[{"key":">20MB/30","value":11},{"key":">200MB/30","value":33},{"key":">2048MB/30","value":10},{"key":">5120MB/30","value":55},{"key":">10240MB/30","value":10}]},{"name":">2048MB/30","values":[{"key":">20MB/30","value":11},{"key":">200MB/30","value":33},{"key":">2048MB/30","value":10},{"key":">5120MB/30","value":55},{"key":">10240MB/30","value":10}]},{"name":">5120MB/30","values":[{"key":">20MB/30","value":11},{"key":">200MB/30","value":33},{"key":">2048MB/30","value":10},{"key":">5120MB/30","value":55},{"key":">10240MB/30","value":10}]},{"name":">10240MB/30","values":[{"key":">20MB/30","value":11},{"key":">200MB/30","value":33},{"key":">2048MB/30","value":10},{"key":">5120MB/30","value":55},{"key":">10240MB/30","value":10}]}]"

注意:我在尝试时使用了map,reduce和color的组合,但这可能是我的无知/体验。我不确定是否可以使用过滤器或任何其他功能。我熟悉这些,但没有我想要的那么多,所以关于这些的一些指示会很棒。

2 个答案:

答案 0 :(得分:1)

您可以将对象用作哈希表并迭代数组。然后存储Device_Model并稍后将其用作键,而所有其他键和值将转到结果集。

var data_p = [[{ key: "Device_Model", value: "test_model" }, { key: ">20MB/30", value: "11" }, { key: ">200MB/30", value: "33" }, { key: ">2048MB/30", value: "10" }, { key: ">5120MB/30", value: "55" }, { key: ">10240MB/30", value: "10" }], [{ key: "Device_Model", value: "0P6B670" }, { key: ">20MB/30", value: "9" }, { key: ">200MB/30", value: "8" }, { key: ">2048MB/30", value: "2" }, { key: ">5120MB/30", value: "23" }, { key: ">10240MB/30", value: "23" }]],
    result = [];

data_p.forEach(function (a) {
    var Device_Model;
    a.forEach(function (b) {
        if (b.key === 'Device_Model') {
            Device_Model = b.value;
            return;
        }
        if (!this[b.key]) {
            this[b.key] = [];
            result.push({ name: b.key, values: this[b.key] });
        }
        this[b.key].push({ key: Device_Model, value: b.value });
    }, this);
}, Object.create(null));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

这是一项相当容易的任务。您只需要存储设备(元数据),以便您知道许多设备将在内部循环。然后你只需要循环n-1个结果。



var data_p = [ [
  {"key": "Device_Model", "value": "test_model"},
  {"key": ">20MB/30", "value": "11"},
  {"key": ">200MB/30", "value": "33"},
  {"key": ">2048MB/30", "value": "10"},
  {"key": ">5120MB/30", "value": "55"},
  {"key": ">10240MB/30", "value": "10"}
], [
  {"key": "Device_Model", "value": "0P6B670"},
  {"key": ">20MB/30", "value": "9"},
  {"key": ">200MB/30", "value": "8"},
  {"key": ">2048MB/30", "value": "2"},
  {"key": ">5120MB/30", "value": "23"},
  {"key": ">10240MB/30", "value": "23"}
] ];

function transform(data) {
  var devices = data.map(function(model) {
    return model[0]['value'];
  });
  var results = [];
  for (var i = 1; i < data[0].length; i++) {
    var values = [];
    for (var d = 0; d < devices.length; d++) {
      values.push({
        key : devices[d],
        value : data[d][i]['value']
      });
    }
    results.push({
      name : data[0][i]['key'],
      values : values
    });
  }
  return results;
}

document.body.innerHTML = JSON.stringify(transform(data_p), null, 4);
&#13;
body {
  font-family: monospace;
  white-space: pre;
}
&#13;
&#13;
&#13;