web-dev-qa-db-fra.com

Mappage d'un tableau d'objets sur des paires clé / valeur dans CoffeeScript

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. ;-)

29

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)
12
Jonathan Lonowski
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
)
78
Zirak
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.

19
Ricardo Tomasi

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);
9
Tieme

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;
}, {})
5
Onato

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.

1
rwitzel

Doublure ES6:

const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]

data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})
1
ducaale