2010-12-09 17 views
10

Tengo un objeto de matriz asociativa en Javascript del que solo necesito una parte. Con una matriz regular, solo usaría slice para obtener la parte que necesito, pero obviamente esto no funcionará en una matriz asociativa. ¿Hay alguna función Javascript integrada que pueda usar para devolver solo una parte de este objeto? De lo contrario, ¿cuáles serían las mejores prácticas para hacerlo? ¡Gracias!Obtenga una porción de una matriz asociativa de Javascript?

+2

Es jQuery es una opción? – James

+0

En primer lugar, cuéntenos sobre el tipo de datos que almacena en él y qué debe hacer con él. ¿Es multidimensional? ¿Necesita ser ordenado? Varios detalles sobre las necesidades específicas serían útiles. –

+0

Sí, estoy usando jQuery en este sitio. –

Respuesta

4

No va a ser una buena manera de 'rebanada' del objeto, que no, pero que podría hacer esto si realmente tenía que:

var myFields = ['field1', 'field2', 'field3']; 

var mySlice = {}; 

for (var i in myFields) { 
    var field = myFields[i]; 

    mySlice[field] = myOriginal[field]; 
} 
+3

Missing hasOwnProperty ... explota en 3 ... 2 ... 1 ...;) –

+0

Hmm, así que básicamente tengo que recorrer las propiedades del objeto? Dado que mi objeto tiene todas las propiedades que necesito en el objeto rebanado, ¿no podría simplemente aumentar un bucle mientras obtengo los números que necesito? es decir, si (i> 0 && i <11)? –

+1

@IvoWetzel ¡Si hay código en la página que agrega propiedades enumerables en el prototipo de Object, entonces es su propia maldita falla! – Raynos

1

Hay una pequeña función que utilizo:

/** 
* Slices the object. Note that returns a new spliced object, 
* e.g. do not modifies original object. Also note that that sliced elements 
* are sorted alphabetically by object property name. 
*/ 
function slice(obj, start, end) { 

    var sliced = {}; 
    var i = 0; 
    for (var k in obj) { 
     if (i >= start && i < end) 
      sliced[k] = obj[k]; 

     i++; 
    } 

    return sliced; 
} 
2

He creado this gist que hace exactamente esto. Devuelve un objeto nuevo con solo los argumentos provistos y deja intacto el objeto anterior.

if(!Object.prototype.slice){ 
    Object.prototype.slice = function(){ 
     var returnObj = {}; 
     for(var i = 0, j = arguments.length; i < j; i++){ 
      if(this.hasOwnProperty(arguments[i])){ 
       returnObj[arguments[i]] = this[arguments[i]]; 
      } 
     } 
     return returnObj; 
    } 
} 

Uso:

var obj = { foo: 1, bar: 2 }; 

obj.slice('foo'); // => { foo: 1 } 
obj.slice('bar'); // => { bar: 2 } 
obj;    // => { foo: 1, bar: 2 } 
+1

También hay [lo opuesto (excepto) disponible] (https://gist.github.com/zykadelic/13ae10dec64d1fd59efe). Sin embargo, funciona directamente en el objeto, en lugar de devolver una copia nueva. – zykadelic

+0

Gracias zykadelic, esto me ha ayudado mucho. –

+0

@DanielLoureiro Me alegro :) – zykadelic

Cuestiones relacionadas