繁体   English   中英

基于公共键/值对重新排列对象数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM