wake-up-neo.com

Wie kann man eine Objekteigenschaft als Parameter übergeben? (JavaScript)

Ich bin mir nicht sicher, ob der Titel für meine Ziele geeignet ist

Ich ordne JSON-Ergebnisse einem Array zu. Da ich dies immer und immer wieder tun muss, möchte ich den Code in einer Funktion verwenden.

In den folgenden Beispielen wiederhole ich mich. Ich habe Eigenschaften namens item.data1, item.data2 und im zweiten Beispiel item.something1, item.something2 ... Wie kann ich diese Eigenschaften als "allgemeine" Argumente an die neu erstellte Funktion übergeben, um sie dort zu verwenden und nicht Wiederholen Sie mich, um diese Karten zurückzugeben. Die neue Funktion sollte für die beiden folgenden Beispiele sowie für andere Fälle verwendbar sein, in denen die Eigenschaften andere Namen haben könnten.

service.getData(function(data) {
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        entry.key = item.data1;
        entry.value = item.data2;

        return entry;
    });
});

service.getSomething(function(data) {
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        entry.key = item.something1;
        entry.value = item.something2;

        return entry;
    });
});
24
maze

verwenden Sie [] mit einer Zeichenfolge, um Eigenschaften dynamisch aus Objekten herauszuholen.

var a = { foo: 123 };
a.foo    // 123
a['foo'] // 123

var str = 'foo';
a[str]   // 123

Das heißt, wir können Ihre Methode so umgestalten, geben Sie einfach die Namen der Eigenschaften an, die Sie als Strings lesen möchten.

var getKeyValueMap = function(data, keyPropName, valuePropName) {
  return $.map(data, function(item, i) {
    return {
      key:   item[keyPropName],
      value: item[valuePropName]
    }
  });
};

service.getData(function(data) {
  return getKeyValueMap(data, 'data1', 'data2');
});

service.getSomething(function(data) {
  return getKeyValueMap(data, 'something1', 'something2');
});
36
Alex Wayne

dies kann mit den []-Operatoren anstelle der .- Notation erfolgen, genau wie in dieser für Sie erstellten Geige: D :

    var data = [{
        data1: 'foo',
        data2: 'bar',
        something1: 'sparky',
        something2: 'arf arf!'},
    {
        data1: 'My name is',
        data2: 'What?',
        something1: 'my name is',
        something2: 'Who?!'}
    ];

    function test(data, prop) {
        var d_length = data.length;
        for (var i = 0; i < d_length; i++) {
            alert(data[i][prop]);
        }
    }

    test(data, 'data1');
1
nozzleman

Sie müssen das item-Objekt und eine Karte mit Elementschlüsseln an die Eingabeschlüssel übergeben. Dies können entweder zwei Arrays, ein Array von Tupeln oder etwas oder ein Objekt sein. Die einfachste Methode, die ich mir vorstellen kann, ist das Deskriptorobjekt in den Eintrag selbst zu ändern:

function mapPropertyNames(source, dest) {
    for (var prop in dest)
        dest[prop] = source[dest[prop]];
    return dest;
}

// and use it like this:

var map = $.map(data, function(item, i) {
    return mapPropertyNames(item, {key:"something1", value:"something2"});
});
0
Bergi

So etwas wie 

service.getData(function(data) {
    var map = {};
    var varNamePrefix = 'data';
    map = $.map(data, function(item, i) {
        return getProperties(item, varNamePrefix);
    });
});

service.getSomething(function(data) {
    var map = {};
    var varNamePrefix = 'something';
    map = $.map(data, function(item, i) {
        return getProperties(item, varNamePrefix);
    });
});

function getProperties(item, varNamePrefix) {
    var ret = {};
    ret.key = item[varNamePrefix + '1'];
    ret.value = item[varNamePrefix + '2'];
    return ret;
}

Kann helfen

Grundsätzlich können Sie eine Funktion verwenden, die ein Eigenschafts-Präfix verwendet und es verwendet, um die tatsächlichen Eigenschaftsnamen zu bilden, die von Elementen abgerufen werden.

0
Raibaz