按唯一键将对象数组排序为数组

Sorting an array of objects into arrays by unique key

本文关键字:数组排序 数组 对象 唯一 一键      更新时间:2023-09-26

我在这方面的新手,所以我希望我只是错过了一些非常明显的东西,但问题是......

我从 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"。

关于我收到的数据需要注意的几件事,我不知道我得到了多少对象,我也不知道这些对象有多长。我只需要匹配我得到的所有密钥。

一个接受键并使用数组创建全局变量的版本。

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>');

使用 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"
  ]
}

演示

您可以使用其他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>');