2012-05-30 10 views
9

En el objeto siguiente, me gustaría cambiar el nombre de la propiedad, thumb, al thumbnail. También me gustaría cambiar los valores de title para incluir etiquetas <span>.Cambie el nombre de los nombres de las propiedades y cambie los valores de varios objetos

Aquí es mi objeto:

var data = [{ 
    thumb: '/images/01.png', 
    title: 'My title', 
},{ 
    thumb: '/images/02.png', 
    title: 'My title', 
},{ 
    thumb: '/images/03.png', 
    title: 'My title', 
}]; 

así es como me gustaría que se vea:

var data = [{ 
    thumbnail: '/images/01.png', 
    title: '<span class="red">title 1</span>', 
},{ 
    thumbnail: '/images/02.png', 
    title: '<span class="red">title 2</span>', 
},{ 
    thumbnail: '/images/03.png', 
    title: '<span class="red">title 3</span>', 
}]; 

Aquí es lo que he intentado que no funciona:

var i=0, count=data.length; 
    for (i=0;i<=count;i++){ 
    data[i].thumbnail=data[i].thumb; 
    data[i].title="<span class='red'>"+data[i].title+"<span>"; 
    } 
+0

¿Estás pidiendo una forma de hacer esto _no_ a mano? Si es así, debes aclarar en tu publicación. –

+0

@HunterMcMillen preguntando cómo se haría esto mediante programación mediante javascript. Supongo que necesito un bucle pero no puedo hacer que funcione. Lo aclararé en mi publicación. –

Respuesta

19

Esto parece hacer el truco:

function changeData(data){ 
    var title; 
    for(var i = 0; i < data.length; i++){ 
     if(data[i].hasOwnProperty("thumb")){ 
      data[i]["thumbnail"] = data[i]["thumb"]; 
      delete data[i]["thumb"]; 
     } 

     if(data[i].hasOwnProperty("title")){ //added missing closing parenthesis 
      title = data[i].title; 
      data[i].title = '<span class="red">' + title + '</span>'; 
     } 
    } 
} 

changeData(data); 

EDIT:

Traté de hacer la función genérica, pero desde que actualizó su respuesta para hacer cosas muy específicas, he añadido la lógica de negocio a la función.

+0

Recomiendo crear un objeto nuevo en lugar de modificar el original – lbstr

10

Puede iterate over the array, establezca una nueva propiedad en cada objeto, y delete la antigua propiedad:

data.forEach(function(e) { 
    e.thumbnail = e.thumb; 
    delete e.thumb;  
}); 

Aquí hay una working example (comprobar la salida de la consola).

Obviamente, querrá utilizar un polyfill para Array.prototype.forEach si desea admitir navegadores antiguos (hay uno en el artículo de MDN al que he vinculado anteriormente, o simplemente podría usar un loop normal for).

+1

gracias por señalar el ciclo forEach. No puedo esperar hasta que no necesitemos un polyfill para esto. – lbstr

+0

@lbstr Oye me encontré con este problema y sabes cómo podemos hacer lo mismo en el controlador en MVC – Vivekh

2

He creado una buena función para cambiar el nombre de propiedades nombres: https://github.com/meni181818/simpleCloneJS/blob/master/renameProperties.js

ejemplo:

var sourceObj = { 
    foo: 'this is foo', 
    bar: {baz: 'this is baz', 
      qux: 'this is qux'} 
}; 
//        the source, rename list 
var replacedObj = renameProperties(sourceObj, {foo: 'foooo', qux: 'quxxxx'}); 
// replacedObj output => { 
     foooo: 'this is foo', 
     bar: {baz: 'this is baz', 
       quxxxx: 'this is qux'} 
    }; 

Puesto que usted está usando jQuery puede utilizar $.each función dentro de esta función:

function renameProperties(sourceObj, replaceList, destObj) { 
    destObj = destObj || {}; 
    $.each(sourceObj, function(key) { 
     if(sourceObj.hasOwnProperty(key)) { 
      if(sourceObj[key] instanceof Array) { 
       if(replaceList[key]) { 
        var newName = replaceList[key]; 
        destObj[newName] = []; 
        renameProperties(sourceObj[key], replaceList, destObj[newName]); 
       } else if(!replaceList[key]) { 
        destObj[key] = []; 
        renameProperties(sourceObj[key], replaceList, destObj[key]); 
       } 
      } else if(typeof sourceObj[key] === 'object') { 
       if(replaceList[key]) { 
        var newName = replaceList[key]; 
        destObj[newName] = {}; 
        renameProperties(sourceObj[key], replaceList, destObj[newName]); 
       } else if(!replaceList[key]) { 
        destObj[key] = {}; 
        renameProperties(sourceObj[key], replaceList, destObj[key]); 
       } 
      } else { 
       if(replaceList[key]) { 
        var newName = replaceList[key]; 
        destObj[newName] = sourceObj[key]; 
       } else if(!replaceList[key]) { 
        destObj[key] = sourceObj[key]; 
       } 
      } 
     } 
    }); 
    return destObj; 
} 

demo: http://jsfiddle.net/g2jzse5k/

Cuestiones relacionadas