web-dev-qa-db-fra.com

Comment passer une propriété d'objet en paramètre? (JavaScript)

Je ne suis pas sûr que le titre corresponde à ce que j'essaie d'atteindre

Je mappe les résultats JSON à un tableau. Parce que je dois le faire encore et encore, je voudrais mettre le code dans une fonction.

Dans les exemples suivants, je me répète. J'ai des propriétés appelées item.data1, item.data2 et dans le deuxième exemple item.something1, item.something2 ... Comment puis-je passer ces propriétés en tant qu'arguments "généraux" à la fonction nouvellement créée afin de les utiliser là-bas et non répète moi-même pour retourner ces cartes? La nouvelle fonction devrait être utilisable pour les deux exemples ci-dessous ainsi que pour d'autres cas où les propriétés pourraient avoir des noms différents.

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

utilisez [] avec une chaîne pour extraire les propriétés des objets de manière dynamique.

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

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

Ce qui signifie que nous pouvons refactoriser votre méthode comme suit: transmettez simplement les noms des propriétés que vous souhaitez lire en tant que chaînes.

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

cela peut être fait en utilisant les opérateurs [] au lieu de la notation .- comme dans dans ce violon ive créé juste pour vous: 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

Vous devrez passer l'objet item et une mappe de clés d'élément à clés d'entrée. Cela peut être soit deux tableaux, un tableau de n-uplets ou quelque chose, ou un objet. La méthode la plus simple à laquelle je puisse penser est de changer l'objet descripteur dans l'entrée elle-même:

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

Quelque chose comme 

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

Peut aider?

En principe, vous pouvez utiliser une fonction qui prend un préfixe de propriété et l’utilise pour former les noms de propriété réels à extraire des éléments.

0
Raibaz