【问题标题】:Merge array of javascript objects by property key按属性键合并javascript对象数组
【发布时间】:2015-12-05 12:49:42
【问题描述】:

首先:我已经找到了this thread,这基本上正是我想要的,但我尽力将它应用到我的需求中——我做不到。

所以,我有以下 javascript 函数:

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;
}

父母数组看起来像this

我的函数创建了这个result

这可能有点复杂,但我需要这样拆分,因为我需要订单。

我想要的是一个包含两个“TEC_MapLocations”的数组,如下所示:

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

关于如何更改我的代码以立即获得所需结果或如何合并结果数组的任何想法?

编辑:我使用了Joseph's solution,并使用了以下(快速而肮脏的)排序函数来取回我想要的排序:

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

【问题讨论】:

    标签: javascript jquery arrays javascript-objects


    【解决方案1】:

    试试这个:

    function joinObjects( array ) {
    
        // Start with empty array
        var ret = new Array();
    
        // Iterate array
        for ( var i = 0; i < array.length; i++ ) {
    
            // Search by fieldname
            var match = false;
            var j;
            for ( j = 0; j < ret.length; j++ ) {
                if ( array[i].Fieldname == ret[j].Fieldname ) { match = true; break; }
            }
    
            // If not exists
            if ( !match ) {
    
                // Intert object
                ret.push({
                    Fieldname: array[i].Fieldname,
                    Value: new Array()
                });
    
            }
    
            // Insert value
            ret[j].Value.push( array[i].Value );
    
        }
    
        // Return new array
        return ret;
    
    }
    

    http://jsfiddle.net/6entfv4x/

    【讨论】:

    • 感谢您的回答,但您的解决方案会为结果创建不同的数组结构。
    【解决方案2】:

    您首先要做的是构建一个以Fieldname 为键、以数组为值的散列。然后你会想使用reduce 将值添加到散列和数组中。然后您可以使用Object.keysmap 将其转换为数组。

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

    【讨论】:

    • 谢谢,效果很好!但是缺少一件事:我的函数将“TEC_Equipment”对象放在前面,因为那是我需要它的地方。您的解决方案只是按 ID 对结果进行排序。
    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 2021-12-28
    • 2016-12-31
    • 2021-03-29
    • 1970-01-01
    • 2023-02-07
    • 2019-11-14
    • 2011-08-28
    相关资源
    最近更新 更多