使用Underscore更改数组中所有对象的值

时间:2014-09-09 08:40:38

标签: javascript arrays underscore.js

我有一个对象数组,其中包含一个名为'memory'的属性,其值为MB。我需要在GB中转换包含具有'memory'值的对象的数组。我怎样才能使用Underscore.js

以下是代码:

 var parseSize = function(obj){
   if (obj === 0 ){
    return 0;
   } else {
     return  parseFloat(obj/1024).toFixed(2);
   }
 }

   var testData=[
       { name: 'ddd',Vcpu: 2, memory: 4096, os: 'Microsoft Windows Server 2008 (32-bit)'}, 
       { name: 'eee',Vcpu: 2, memory: 2040, os: 'Microsoft Windows Server 2008 (32-bit)'},
       { name: 'ddd',Vcpu: 2, memory: 4096, os: 'Microsoft Windows Server 2008 (32-bit)'}, 
       { name: 'eee',Vcpu: 2, memory: 2040, os: 'Microsoft Windows Server 2008 (32-bit)'}
   ];

  testData =_.invoke(testData , function(){
              testData['memory'] = parseSize(testData['memory']) + " GB";
            });
  console.log(testData);

以上代码无效。请告诉我出错的地方。

添加Jsfiddle链接:http://jsfiddle.net/prashdeep/k29zuba2/

4 个答案:

答案 0 :(得分:2)

代码中出现问题的答案:

  1. 您应该使用_.each
  2. 您不应将testData重新分配给结果
  3. 您应该访问"memory"中每个项目的testData属性,而不是testData本身
  4. 因此,将您的后半部分代码更改为:

    _.each(testData , function(datum){
        datum['memory'] = parseSize(datum['memory']) + " GB";
    });
    
    console.log(testData);
    

答案 1 :(得分:1)

您可以使用map。这是自ES5以来内置于JavaScript中的:

var result = testData.map(function(x) {
    x.memory = parseSize(x.memory) + ' GB'
    return x
})

答案 2 :(得分:1)

使用下划线_.each,您可以执行以下操作:

 _.each(testData , function( item ){
    item['memory'] = parseSize(item['memory']) + " GB";
 });

请参阅jsfiddle example

如果您想支持IE8等旧浏览器,请不要使用map或forEach。

答案 3 :(得分:0)

var parseSize = function(obj){
   if (obj === 0 ){
    return 0;
   } else {
     return  parseFloat(obj/1024).toFixed(2);
   }
 }

   var testData=[
       { name: 'ddd',Vcpu: 2, memory: 4096, os: 'Microsoft Windows Server 2008 (32-bit)'}, 
       { name: 'eee',Vcpu: 2, memory: 2040, os: 'Microsoft Windows Server 2008 (32-bit)'},
       { name: 'ddd',Vcpu: 2, memory: 4096, os: 'Microsoft Windows Server 2008 (32-bit)'}, 
       { name: 'eee',Vcpu: 2, memory: 2040, os: 'Microsoft Windows Server 2008 (32-bit)'}
   ];

  testData.forEach(function(d){ d.memory = parseSize(d.memory); });

  console.log(testData);