[Javascript] Objekte zusammenführen (assoziative Arrays)



Answers

So macht es Prototype:

Object.extend = function(destination, source) {
    for (var property in source) {
        if (source.hasOwnProperty(property)) {
            destination[property] = source[property];
        }
    }
    return destination;
};

genannt als zum Beispiel:

var arr1 = { robert: "bobby", john: "jack" };
var arr2 = { elizabeth: "liz", jennifer: "jen" };

var shortnames = Object.extend(arr1,arr2);

EDIT : hinzugefügt hasOwnProperty () überprüfen, wie von Bucabay in Kommentaren richtig hingewiesen

Question

Was ist die beste Art, zwei assoziative Arrays in JavaScript zusammenzuführen? Tut es jeder, indem er seine eigene Schleife macht?




jquery hat einen booleschen Wert für eine tiefe Kopie. Du könntest so etwas machen:

MergeRecursive = function(arr1, arr2){
    $.extend(true, arr1, arr2);
    return arr1;                
};

Sie können diese Funktion auch bearbeiten, um n-Arrays zum Zusammenführen zu unterstützen.

ArrayMergeRecursive = function(){
     if(arguments.length < 2){
          throw new Error("ArrayMergeRecursive: Please enter two or more objects to merge!");
     }

    var arr1=arguments[0];
    for(var i=0; i<=arguments.length; i++ ){
        $.extend(true, arr1, arguments[i]);                 
    }

    return arr1;                
};

Jetzt kannst du es tun

var arr1 = {'color': {'mycolor': 'red'}, 3: 5},
    arr2 = {4: 10, 'color': {'favorite': 'green', 0: 'blue'}},
    arr3 = ['Peter','Jhon','Demosthenes'],
    results = ArrayMergeRecursive(arr1, arr2, arr3); // (arr1, arr2 ... arrN)
console.log("Result is:", results);



Rekursive Lösung (erweitert auch Arrays von Objekten) + Null überprüft

var addProps = function (original, props) {
    if(!props) {
        return original;
    }
    if (Array.isArray(original)) {
        original.map(function (e) {
            return addProps(e, props)
        });
        return original;
    }
    if (!original) {
        original = {};
    }
    for (var property in props) {
        if (props.hasOwnProperty(property)) {
            original[property] = props[property];
        }
    }
    return original;
};

Tests

console.log(addProps([{a: 2}, {z: 'ciao'}], {timestamp: 13}));
console.log(addProps({single: true}, {timestamp: 13}));
console.log(addProps({}, {timestamp: 13}));
console.log(addProps(null, {timestamp: 13}));

[ { a: 2, timestamp: 13 }, { z: 'ciao', timestamp: 13 } ]
{ single: true, timestamp: 13 }
{ timestamp: 13 }
{ timestamp: 13 }



Halte es einfach...

function mergeArray(array1,array2) {
  for(item in array1) {
    array2[item] = array1[item];
  }
  return array2;
}



Im dojo wären die 2-Objekte / Arrays "merge" lang.mixin(destination, source) - Sie können auch mehrere Quellen zu einem Ziel zusammenführen usw. - Einzelheiten finden Sie in der Referenz der Mix- Funktion .




Yahoo UI (YUI) hat dazu auch eine Hilfsfunktion:

http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html

YAHOO.namespace('example');

YAHOO.example.set1 = { foo : "foo" };
YAHOO.example.set2 = { foo : "BAR", bar : "bar" };
YAHOO.example.set3 = { foo : "FOO", baz : "BAZ" };

var Ye = YAHOO.example;

var merged = YAHOO.lang.merge(Ye.set1, Ye.set2, Ye.set3);



Rolling Your Own Erweiterung / Mixin Funktion

function extend(objects) {
    var args
        , first = Array.prototype.slice.call(arguments, 0, 1)[0]
        , second;

    if (arguments.length > 1) {
        second = Array.prototype.splice.call(arguments, 1, 1)[0];
        for (var key in second) {
            first[key] = second[key];
        }
        args = Array.prototype.slice.call(arguments, 0);
        return extend.apply(this, args);
    }

    return first;
}

...

var briansDirections = {
    step1: 'Remove pastry from wrapper.',
    step2: 'Place pastry toaster.',
    step3: 'Remove pastry from toaster and enjoy.',
};
extend(briansDirections, { step1: 'Toast Poptarts' }, { step2: 'Go ahead, toast \'em' }, { step3: 'Hey, are you sill reading this???' });

...

Dies erweitert einfach einen Splat von Objekten rekursiv. Beachten Sie auch, dass diese rekursive Funktion TCO ( Tail-Call Optimized ) ist, da ihre Rückgabe der letzte Aufruf an sich selbst ist.

Darüber hinaus möchten Sie möglicherweise gezielte Eigenschaften . In diesem Fall möchten Sie möglicherweise Objekte basierend auf id , quantity oder einer anderen Eigenschaft zusammenfassen. Dieser Ansatz könnte ein kleines Buch darüber geschrieben haben und erfordert eine Objekt-Nebeneinanderstellung und kann sehr komplex werden. Ich habe dafür eine kleine Bibliothek geschrieben, die auf Anfrage erhältlich ist.

Hoffe das hilft!




Links