按唯一键将对象数组排序为数组
Sorting an array of objects into arrays by unique key
我在这方面的新手,所以我希望我只是错过了一些非常明显的东西,但问题是......
我从 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>');
相关文章:
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 根据Javascript中的字符串值对数组的数组进行排序
- Javascript中的多维数组排序索引问题
- 按每个数组中的一个值对一组关联数组进行排序
- 可以't在对另一个数组排序后访问任何数组
- 如何按日期对Javascript对象数组排序
- 数组排序后显示更改
- 当许多元素相等时,Javascript数组排序无法正常工作
- Javascript数组排序速度受字符串长度的影响
- 按唯一键将对象数组排序为数组
- 以 js 为单位的数组排序
- 数字数组排序错误
- js 数组排序无法正常工作
- 数组排序.论点从何而来
- 不需要的数组排序
- 数组排序不正确/不可预测,使用 indexOf 时
- Javascript将数组排序到树中
- 随后的多维数组排序会产生意外的结果
- 数组排序基于纯javascript搜索文本匹配
- 根据字符串将数组排序为数组new