![](/img/trans.png)
[英]Sorting an array of objects based on relevance of a key-value pair (JavaScript)
[英]Rearrange an array of objects based on a common key/value pair
我有以下对象数组:
[
{
message: 'This is a test',
from_user_id: 123,
to_user_id: 567
},
{
message: 'Another test.',
from_user_id: 123,
to_user_id: 567
},
{
message: 'A third test.',
from_user_id: '456',
to_user_id: 567
}
]
如何构造一个新的对象数组,其中最外层的对象键基于原始数组中的公共键?
这就是我所追求的:
[
{
123: [
{
message: 'This is a test',
from_user_id: 123,
to_user_id: 567
},
{
message: 'Another test.',
from_user_id: 123,
to_user_id: 567
}
]
},
{
456: [
{
message: 'A third test.',
from_user_id: '456',
to_user_id: 567
}
]
}
]
请注意,在第一个数组中,用户ID 123
显示在两个对象中。 这将是新数组中第一个元素的对象键。
您可以使用对象并将from_user_id
属性作为对象的键。 然后将实际对象推送到组。 要获得最终结果,请迭代groups
的键并为任何组构建新对象。
var data = [{ message: 'This is a test', from_user_id: 123, to_user_id: 567 }, { message: 'Another test.', from_user_id: 123, to_user_id: 567 }, { message: 'A third test.', from_user_id: '456', to_user_id: 567 }], groups = Object.create(null), result; data.forEach(function (a) { groups[a.from_user_id] = groups[a.from_user_id] || []; groups[a.from_user_id].push(a); }); result = Object.keys(groups).map(function (k) { var temp = {}; temp[k] = groups[k]; return temp; }); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
与单循环方法一起使用
var data = [{ message: 'This is a test', from_user_id: 123, to_user_id: 567 }, { message: 'Another test.', from_user_id: 123, to_user_id: 567 }, { message: 'A third test.', from_user_id: '456', to_user_id: 567 }], result = data.reduce(function (groups) { return function (r, a) { var temp = {}; if (!groups[a.from_user_id]) { groups[a.from_user_id] = []; temp[a.from_user_id] = groups[a.from_user_id]; r.push(temp); } groups[a.from_user_id].push(a); return r; }; }(Object.create(null)), []); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以全功能获取所有键将其过滤掉并将其作为json对象映射回来
var b = a.map(key => key['from_user_id'])
var c = {}
b.map(elt => c[elt] = a.filter(k => k.from_user_id == elt))
console.log(c)
var users = [ { message: 'This is a test', from_user_id: 123, to_user_id: 567 }, { message: 'Another test.', from_user_id: 123, to_user_id: 567 }, { message: 'A third test.', from_user_id: '456', to_user_id: 567 } ]; console.log(_.groupBy(users,'from_user_id'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
使用Lodash将使您变得非常轻松。 假设你有:
var users = [
{
message: 'This is a test',
from_user_id: 123,
to_user_id: 567
},
{
message: 'Another test.',
from_user_id: 123,
to_user_id: 567
},
{
message: 'A third test.',
from_user_id: '456',
to_user_id: 567
}
];
和Lodash
在一条线上, 你会想要你想要的完全 :
users = _.groupBy(users,'from_user_id')
您只需初始化results
数组,遍历数据数组并检查results
数组中from_user_id
存在迭代的from_user_id
,在其上推送迭代对象,否则使用新的from_user_id
键创建新对象。
这是你的代码应该如何:
var results = [];
arr.forEach(function(obj){
let id = obj["from_user_id"];
if(!results.some(function(r){
return r[id];
})){
let el = {};
el[id] = [];
el[id].push(obj);
results.push(el);
}else{
results.forEach(function(res){
if(res[id]){
res[id].push(obj);
}
});
}
});
演示:
var arr = [{ message: 'This is a test', from_user_id: 123, to_user_id: 567 }, { message: 'Another test.', from_user_id: 123, to_user_id: 567 }, { message: 'A third test.', from_user_id: 456, to_user_id: 567 }]; var results = []; arr.forEach(function(obj){ let id = obj["from_user_id"]; if(!results.some(function(r){ return r[id]; })){ let el = {}; el[id] = []; el[id].push(obj); results.push(el); }else{ results.forEach(function(res){ if(res[id]){ res[id].push(obj); } }); } }); console.log(results);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.