Forma abreviada de construir un objeto JS con un nombre de propiedad variable [duplicado]

¿Existe una forma abreviada de crear un objeto con una variable de campo de propiedad?

Digamos que tengo la variable PROP.Todo.PRIORITY = 'priority' y luego, usando Columna vertebral En este ejemplo, quiero ahorrar esta propiedad, ¿cómo puedo evitar tener que crear un nuevo objeto, asignarlo a alguna variable y luego establecer la propiedad?

Quiero lograr esto:

var tmpObj = {};
tmpObj[PROP.Todo.PRIORITY] = "high";
this.model.save(tmpObj);

He intentado algo como esto, que no tuvo éxito:

this.model.save(({}[PROP.Todo.PRIORITY] = "high"));

¿Alguna sugerencia? De lo contrario, escribiré muchas declaraciones de objetos a mano.

preguntado el 04 de julio de 12 a las 10:07

2 Respuestas

Si guarda solo un parámetro, Model.save tiene una forma alternativa de recibir argumentos, (key,value,options)

http://backbonejs.org/#Model-save

ahorrar modelo.guardar([atributos], [opciones])
[...] Al igual que con set, puede pasar claves y valores individuales en lugar de un hash. [...]

lo que significa que podrías escribir tu ejemplo como

this.model.save(PROP.Todo.PRIORITY, "high");

Si desea guardar varias propiedades simultáneamente, deberá escribir un objeto temporal.

Respondido 04 Jul 12, 11:07

+1 por leer los documentos. :) No me di cuenta de que había una manera de hacer eso. - casablanca

Gracias - esto es lo que voy a ir con. Sin embargo, creo que voy a aceptar la otra respuesta ya que en el futuro, si las personas llegan aquí a través de Google, responderá más directamente al título de la pregunta ... ¡espero que lo entiendas! - Ed.

Vale la pena señalar; yo estaba usando el Aplicación web TODO MVC y usa Backbone 0.5.0-pre que no admite la forma sugerida de guardar atributos. La última versión (0.9.2 en el momento de escribir este artículo) sí lo hace. - Ed.

@Ed. Buena captura, había olvidado que esta sintaxis venía con 0.9.0 - Nikoshr

Si solo desea una forma más fácil de crear el objeto, ¿qué le parece usar una función auxiliar?

function obj(prop, value) {
  var o = {};
  o[prop] = value;
  return o;
}

this.model.save(obj(PROP.Todo.PRIORITY, "high"));

No estoy seguro de entender la última parte de su pregunta:

De lo contrario, voy a crear muchos objetos temporales.

Tendrá que crear un objeto en cualquier caso, y dudo que la creación de objetos sea un problema de rendimiento.

Respondido 04 Jul 12, 11:07

Gracias por la respuesta. Me gusta esta solución, aunque la otra respuesta probablemente sea mi ruta preferida. Y sí, mi redacción podría haber sido mejor; No me refiero a 'temporal', lo que quise decir fue que se requeriría mucha declaración de nuevos objetos... es decir, mucho código inflado, no era una preocupación sobre el rendimiento. - Ed.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.