J'ai un tableau d'éléments que je voudrais appliquer un mappage pour le convertir en paires de valeurs clés sur un seul objet (pour imiter un tableau associatif).
L'approche de La déstructuration peut-elle être utilisée pour effectuer une projection dans CoffeeScript? ne semble pas fonctionner pour moi car elle résulte en un tableau simple au lieu de paires clé/valeur.
Mon langage de choix est CoffeeScript ou JavaScript.
Un exemple:
[{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}]
est censé se transformer en:
{
a: 'b',
d: 'e'
}
Les doublures sont préférées. ;-)
Pour corriger l'erreur de syntaxe, vous devrez développer { @name: @value }
Pour:
o = {}; o[@name] = @value; o
Vous pouvez ensuite fusionner les objets avec $.extend()
et un splat (avec l'objet vide pour éviter d'étendre accidentellement jQuery):
$.extend {}, $(row).children('input').map(() -> o = {}; o[@name] = @value; o)...
Cependant, une option plus simple serait simplement d'utiliser un 2 lignes:
result = {}
$(row).children('input').each(() -> result[@name] = @value)
var arr = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}];
var obj = arr.reduce(function ( total, current ) {
total[ current.name ] = current.value;
return total;
}, {});
Javascript pur. C'est pratiquement une doublure, et ça a l'air hawt.
Array.prototype.reduce est ES5, mais n'est pas difficile à caler. Voici un exemple de cale:
Array.prototype.reduce = function ( fun, initVal ) {
var sum = initVal || this[ 0 ],
i = 1, len = this.length;
do {
sum = fun.call( undefined, sum, this[i], i, this );
} while ( ++i < len );
return sum;
};
arr.reduce
est une version sophistiquée de arr.map
, qui est une version sophistiquée de arr.forEach
. Vous pouvez le faire pour le même effet:
var obj = {};
arr.forEach(function ( val ) {
obj[ val.name ] = val.value;
});
//and using jQuery.each
var obj = {};
$.each( arr, function ( index, val ) {
obj[ val.name ] = val.value;
});
//latter version in coffeescript:
obj = {}
$.each( arr, (index, val) ->
obj[ val.name ] = val.value
)
values = {}
values[name] = value for {name, value} in arr
ou en javascript:
var values = {}
arr.forEach(function(o){
values[o.name] = o.value
})
C'est presque exactement ce que compile CoffeeScript.
Ou en utilisant ES6 ordinaire:
const old = [
{name: 'a', value: 'b', other: 'c'},
{name: 'd', value: 'e', other: 'f'}
]
const transformed = Object.assign(
{},
...old.map(({name, value}) => ({ [name]: value }))
);
console.log(transformed);
Utilisation de Array.prototype.reduce () :
var arrayOfObjects = [
{name: 'a', value: 'b', other: 'c'},
{name: 'd', value: 'e', other: 'f'}
];
arrayOfObjects.reduce(function(previousValue, currentValue, currentIndex) {
previousValue[currentValue.name] = currentValue.value;
return previousValue;
}, {})
Jetez un oeil à http://coffeescriptcookbook.com/chapters/arrays/creating-a-dictionary-object-from-an-array
myArray = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}]
dict = {}
dict[obj['name']] = obj['value'] for obj in myArray when obj['name']?
console.log(JSON.stringify(dict, 0, 2));
Cela produit exactement ce que vous voulez.
Doublure ES6:
const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]
data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})