通过属性键合并JavaScript对象数组 [英] Merge array of javascript objects by property key

查看:131
本文介绍了通过属性键合并JavaScript对象数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先:我已经找到<一href=\"http://stackoverflow.com/questions/26476287/merge-an-array-of-javascript-objects-based-on-a-key-property-multilevel\">this螺纹,这基本上就是我想要的是什么,但我尽我所能将它应用到我的需要 - 我不能

所以,我有以下的JavaScript函数:

函数loadRelationData(对象){
    VAR的结果= [];
    变种父母= []
    父母= getParentObjectsByObjectID(对象['对象ID']);    变种tmpFirstObjects = [];
    变种tmpOtherObjects = [];
    $。每个(父母,功能(_,父母){
        VAR的keyName ='Übergeordnete'+父['对象类型'];
        变种pushObject = {};
        如果(家长['对象类型'] ==对象['对象类型']){
            pushObject ['字段名'] =的keyName;
            pushObject ['值'] =父['名称'];
            tmpFirstObjects.push(pushObject);
        }其他{
            pushObject ['字段名'] =的keyName;
            pushObject ['值'] =父['名称'];
            tmpOtherObjects.push(pushObject);
        }
    });
    结果= result.concat(tmpFirstObjects).concat(tmpOtherObjects);    返回结果;
}

父母阵列看起来像

和我的函数创建此结果

这可能是一个有点复杂,但我需要它分裂这样的,因为我需要的顺序。

我要的是既TEC_MapLocations阵列连接在一起是这样的:

  [
 {字段名:ÜbergeordneteTEC_Equipment',值:E0192},
 {字段名:ÜbergeordneteTEC_MapLocation',值:['M100','M200']},
 {字段名:ÜbergeordneteTEC_FunctionalLocation',值:'FL456'}
]

如何改变我的code,以达到预期的效果马上任何意见或如何将结果合并数组?

编辑:我用约瑟夫的解决方案并使用了以下(快速和肮脏的)排序功能找回我想要的排序:

  output.sort(功能(A,B){
    如果(a.ObjectType == object.ObjectType){
        返回-1
    }其他{
        返回1
    }
});


解决方案

你想要做的第一件事就是建立与字段名为重点的哈希和数组作为价值。然后,你想使用减少来的值​​加入到散列和数组。然后,你可以用它转换成一个数组 Object.keys 地图

\r
\r

VAR输入= [\r
  {名称:'M100',对象ID:1,对象类型:'TEC_MapLocation},\r
  {名称:'M200',对象ID:2,对象类型:'TEC_MapLocation},\r
  {名称:'FL456,对象ID:4,对象类型:TEC_FunctionalLocation},\r
  {名称:E0192,对象ID:5,对象类型:TEC_Equipment'}\r
];\r
\r
VAR哈希= input.reduce(功能(进位项){\r
  \r
  //创建名字\r
  变量名称='Übergeordnete'+ item.ObjectType;\r
\r
  //如果数组名称不存在,创建它\r
  如果(!携带[名])进行[名] = [];\r
\r
  //如果项目不在阵中,添加它。\r
  如果(!〜套利【名称】.indexOf(item.Name))进行[名] .push(item.Name);\r
\r
  返回矣;\r
},{});\r
\r
//将散列到一个数组\r
无功输出= Object.keys(散).MAP(功能(键,索引数组){\r
  返回{字段名:键,值:哈希[关键]}\r
});\r
\r
的document.write(JSON.stringify(输出));

\r

\r
\r

First of all: I already found this thread, which basically is exactly what I want, but I tried my best to apply it to my needs - I couldn't.

So, I have the following javascript function:

function loadRelationData(object) {
    var result = [];
    var parents = []
    parents = getParentObjectsByObjectID(object['ObjectID']);

    var tmpFirstObjects = [];
    var tmpOtherObjects = [];
    $.each(parents, function (_, parent) {
        var keyName = 'Übergeordnete ' + parent['ObjectType'];
        var pushObject = {};
        if (parent['ObjectType'] == object['ObjectType']) {
            pushObject['Fieldname'] = keyName;
            pushObject['Value'] = parent['Name'];
            tmpFirstObjects.push(pushObject);
        } else {
            pushObject['Fieldname'] = keyName;
            pushObject['Value'] = parent['Name'];
            tmpOtherObjects.push(pushObject);
        }
    });
    result = result.concat(tmpFirstObjects).concat(tmpOtherObjects);

    return result;
}

The parents array looks like this

And my function creates this result

This might be a bit complicated, but I need to split it up like this, because I need the order.

What I want is an array with both "TEC_MapLocations" joined together like this:

[
 {Fieldname: 'Übergeordnete TEC_Equipment', Value: 'E0192'}, 
 {Fieldname: 'Übergeordnete TEC_MapLocation', Value: ['M100', 'M200']}, 
 {Fieldname: 'Übergeordnete TEC_FunctionalLocation', Value: 'FL456'}
]

Any ideas on how to alter my code to achieve the desired result right away or how to merge the results array?

edit: I used Joseph's solution and used the following (quick and dirty) sort function to get back my desired sorting:

output.sort(function (a, b) {
    if (a.ObjectType == object.ObjectType) {
        return -1
    } else {
        return 1
    }
});

解决方案

What you'd want to do first is build a hash with Fieldname as key, and an array as value. Then you'd want to use reduce to add the values into the hash and array. Then you can transform it into an array using Object.keys and map.

var input = [
  {Name: 'M100', ObjectID: 1, ObjectType: 'TEC_MapLocation'},
  {Name: 'M200', ObjectID: 2, ObjectType: 'TEC_MapLocation'},
  {Name: 'FL456', ObjectID: 4, ObjectType: 'TEC_FunctionalLocation'},
  {Name: 'E0192', ObjectID: 5, ObjectType: 'TEC_Equipment'}
];

var hash = input.reduce(function(carry, item){
  
  // Create the name
  var name = 'Übergeordnete ' + item.ObjectType;

  // If array with name doesn't exist, create it
  if(!carry[name]) carry[name] = [];

  // If item isn't in the array, add it.
  if(!~carry[name].indexOf(item.Name)) carry[name].push(item.Name);

  return carry;
}, {});

// Convert the hash into an array
var output = Object.keys(hash).map(function(key, index, array){
  return { Fieldname: key, Value: hash[key] }
});

document.write(JSON.stringify(output));

这篇关于通过属性键合并JavaScript对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆