¿Hay alguna manera de especificar elementos comunes para literales de objeto en una matriz?

Por ejemplo:

var array = [ {key: "hi", label: "Hi", formatter:deleteCheckboxFormatter},
              {key: "hello", label: "Hello", formatter:deleteCheckboxFormatter},
              {key: "wut", label: "What?", formatter:deleteCheckboxFormatter}];

Los tres registros usan el mismo formateador. ¿Cómo refactorizarías esto?

3
Verhogen 19 oct. 2009 a las 11:11

3 respuestas

La mejor respuesta

Se me ocurren un par de alternativas:

Una función auxiliar con el valor predeterminado para el campo común:

function make(key, label) {
  return {'key': key, 'label': label, formatter:deleteCheckboxFormatter};
}

var array = [ make("hi",  "Hi"),
              make("hello", "Hello"),
              make("wut", "What?")];

O una función más genérica que acepta un argumento para la propiedad del formateador:

function make (formatter) {
  return function (key, label) {
    return {'key': key, 'label': label, 'formatter':formatter};
  }
}

// a function to build objects that will have a 'fooFormatter'
var foo = make('fooFormatter'); 

var array = [ foo ("hi",  "Hi"),
              foo ("hello", "Hello"),
              foo ("wut", "What?")];

Y lo último que me viene a la mente es simplemente iterar sobre la matriz asignando el campo común:

var array = [ {key: "hi", label: "Hi"},
              {key: "hello", label: "Hello"},
              {key: "wut", label: "What?"}];

var i = array.length;
while (i--) {
  array[i].formatter = 'deleteCheckboxFormatter';
}

Utilicé aquí un ciclo while en orden inverso, porque el orden de iteración no es importante y este tipo de ciclo funciona mejor.

3
Bill the Lizard 30 jul. 2012 a las 01:07

Podrías hacer un objeto con un constructor:

function Obj(key, label){
  this.key = key;
  this.label = label;
  this.formatter = "deleteCheckboxFormatter";
}
var array = [ new Obj("hi", "Hi"),
              new Obj("hello", "Hello"),
              new Obj("wut", "What?") ];
0
Marius 19 oct. 2009 a las 07:40
var array = [ {key: "hi", label: "Hi"},
              {key: "hello", label: "Hello"},
              {key: "wut", label: "What?"}];

for(var item in array)
  item["formatter"] = deleteCheckboxFormatter;
0
Amarghosh 19 oct. 2009 a las 07:21