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;
});
});
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');
});
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');
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"});
});
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.