【问题标题】:Sorting an array of objects into arrays by unique key通过唯一键将对象数组排序为数组
【发布时间】:2016-03-11 12:29:02
【问题描述】:

我在这方面很菜鸟,所以我期待我只是错过了一些非常明显的东西,但问题是……

我从 JSON 调用中返回未知数量的对象,我需要匹配所有对象键并将它们放入自己的数组中。问题是我不知道每个数组中有多少个对象,为了说明我的问题,这是我收到的数据的一个非常简化的版本。

resultOfCall = [
  {
    'x': 'Lorem',
    'y': 'ipsum',
    'z': 'dolor'
  },
  {
    'x': 'sit',
    'y': 'amet',
    'z': 'asdf',
    'a': 'qwerty'
  },
  {
    'x': 'consectetur',
    'y': 'adipiscing',
    'z': 'elit'
  }
]

我想获取这些数据并为每个唯一键创建一个数组,以便上述数据看起来像这样......

var a = ['qwerty'];
var x = ['lorem','sit','consectetur'];
var y = ['ipsum', 'amet', 'adipiscing'];
var z = ['dolor', 'asdf', 'elit'];

现在我上面的数据的一个明显问题是我仍然需要知道 x 被称为“x”。

关于我收到的数据有几点需要注意,我不知道我要返回多少对象,也不知道这些对象的长度。我只需要匹配我得到的所有键。

【问题讨论】:

  • 请提供您的代码,您工作至今。
  • 您是否需要每个数组都是一个单独的列表,并且它的名称与返回的对象列表中的键名完全相同?
  • @Nayana_Das 我没有走多远,只能推入一个预定义的数组名称,所以我认为不值得为那些不起作用的东西添加更多阅读。跨度>

标签: javascript arrays sorting object


【解决方案1】:

获取键并使用数组生成全局变量的版本。

var resultOfCall = [{ 'x': 'Lorem', 'y': 'ipsum', 'z': 'dolor' }, { 'x': 'sit', 'y': 'amet', 'z': 'asdf', 'a': 'qwerty' }, { 'x': 'consectetur', 'y': 'adipiscing', 'z': 'elit' }];

void function (data) {
    var r = window;
    data.forEach(function (a) {
        Object.keys(a).forEach(function (k) {
            r[k] = r[k] || [];
            r[k].push(a[k]);
        });
    });
}(resultOfCall);

document.write('<pre>a: ' + JSON.stringify(a, 0, 4) + '</pre>');
document.write('<pre>x: ' + JSON.stringify(x, 0, 4) + '</pre>');
document.write('<pre>y: ' + JSON.stringify(y, 0, 4) + '</pre>');
document.write('<pre>z: ' + JSON.stringify(z, 0, 4) + '</pre>');

另一种解决方案,它返回带有分组键的对象。

var resultOfCall = [{ 'x': 'Lorem', 'y': 'ipsum', 'z': 'dolor' }, { 'x': 'sit', 'y': 'amet', 'z': 'asdf', 'a': 'qwerty' }, { 'x': 'consectetur', 'y': 'adipiscing', 'z': 'elit' }],
    grouped = function (data) {
        var r = {};
    data.forEach(function (a) {
        Object.keys(a).forEach(function (k) {
            r[k] = r[k] || [];
            r[k].push(a[k]);
        });
    });
    return r;
}(resultOfCall);

document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

【讨论】:

    【解决方案2】:

    使用reduce将变量作为键/值对存储在对象中:

    var obj = resultOfCall.reduce(function (p, c) {
      Object.keys(c).forEach(function (el) {
        p[el] = p[el] || [];
        p[el].push(c[el]);
      });
      return p;
    }, {});
    

    输出

    {
      "x": [
        "Lorem",
        "sit",
        "consectetur"
      ],
      "y": [
        "ipsum",
        "amet",
        "adipiscing"
      ],
      "z": [
        "dolor",
        "asdf",
        "elit"
      ],
      "a": [
        "qwerty"
      ]
    }
    

    DEMO

    【讨论】:

      【解决方案3】:

      您可以使用额外的object 来存储您的数组和Array.prototype.forEach 函数,请参见示例

      var resultOfCall = [ { 'x': 'Lorem', 'y': 'ipsum', 'z': 'dolor' }, { 'x': 'sit', 'y': 'amet', 'z': 'asdf', 'a': 'qwerty' }, { 'x': 'consectetur', 'y': 'adipiscing', 'z': 'elit' } ];
      
      var obj = {};
      
      resultOfCall.forEach(function(e) {
          Object.keys(e).forEach(function(k) {
              if (obj[k]) {
                  obj[k].push(e[k]);
              } else {
                  obj[k] = [e[k]];
              }
          });
      });
      
      
      document.write('<pre>' + JSON.stringify(obj,0,2) + '</pre>');

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 2018-01-29
        • 2019-02-23
        • 2021-12-24
        相关资源
        最近更新 更多