2012-05-30 106 views
9

在下面的對象中,我想將屬性名稱thumb更改爲thumbnail。我還想將title的值更改爲包含<span>標籤。重命名屬性名稱並更改多個對象的值

這是我的目標:

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

這裏就是我想怎麼看:

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>', 
}]; 

這裏就是我試過不工作:

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

您是否要求一種方法來做到這一點_不手工?如果是這樣,你應該在你的帖子中澄清。 –

+0

@HunterMcMillen詢問我將如何使用JavaScript以編程方式完成此操作。我假設我需要一個for循環,但不能讓它工作。我會在我的文章中澄清。 –

回答

19

這似乎在做伎倆:

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

編輯:

我試圖使功能一般,但因爲你更新你的答案做的很具體的事情,我已經添加了業務邏輯功能。

+0

我建議創建一個新的對象,而不是修改原來的 – lbstr

10

您可以iterate over the array,在每個對象設置一個新的屬性,delete老物業:

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

這裏有一個working example(檢查控制檯輸出)。

顯然,如果您想支持舊瀏覽器(在上面鏈接的MDN文章中有一個,或者您可以使用正常的for循環),您將需要使用polyfill作爲Array.prototype.forEach

+1

感謝指出forEach循環。不能等到我們不需要爲此填充填充。 – lbstr

+0

@lbstr嗨,我遇到了這個問題,你知道我們怎麼能在控制器本身在MVC中做同樣的事情 – Vivekh

2

我創建了一個很好的功能來重命名的屬性名稱:https://github.com/meni181818/simpleCloneJS/blob/master/renameProperties.js

例如:

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'} 
    }; 

由於您使用jQuery你可以使用這個功能裏面$.each功能:

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; 
} 

演示:http://jsfiddle.net/g2jzse5k/