通过 属性 键合并 javascript 个对象的数组

Merge array of javascript objects by property key

首先:我已经找到了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;
}

parents 数组看起来像 this

我的函数创建了这个 result

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

我想要的是一个数组,其中 "TEC_MapLocations" 像这样连接在一起:

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

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

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

output.sort(function (a, b) {
    if (a.ObjectType == object.ObjectType) {
        return -1
    } else {
        return 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/

您首先要做的是以 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));