2017-05-09 52 views
0

我使用loadash在我的項目 添加對象的屬性,讓單個對象,我有對象數組這樣在陣列由loadash

[{ 
    "rating": { 
     "time_to_table": 5, 
     "value_for_money": 5, 
     "innovation": 5, 
     "plating_decoration": 5, 
     "taste": 5 
    } 
}, { 
    "rating": { 
     "time_to_table": 0, 
     "value_for_money": 3, 
     "innovation": 2, 
     "plating_decoration": 2, 
     "taste": 4 
    } 
}] 

現在我想這樣的輸出通過增加每個屬性,並希望單反對這樣

"rating": { 
    "time_to_table": 5, 
    "value_for_money": 8, 
    "innovation": 7, 
    "plating_decoration": 7, 
    "taste": 9 
} 

我已經試過這

 var obj = { 
      "time_to_table": 0, 
      "value_for_money": 0, 
      "innovation": 0, 
      "plating_decoration": 0, 
      "taste": 0, 
      "total" : 5 * data.length 
     } 

     _.forEach(data,function(d){   
      obj.time_to_table += d.rating.time_to_table; 
      obj.value_for_money += d.rating.value_for_money; 
      obj.innovation += d.rating.innovation; 
      obj.plating_decoration += d.rating.plating_decoration; 
      obj.taste += d.rating.taste; 
     }); 
+0

可以將其與普通的JavaScript做什麼? – Weedoze

+0

我可以循環所有數組並推送,但我想要像reduce @ Weedoze – Ash

回答

1

隨着Lodash,你可以做到這一點使用reduce()和以自定義函數作爲參數的mergeWith()

var data = [{"rating":{"time_to_table":5,"value_for_money":5,"innovation":5,"plating_decoration":5,"taste":5}},{"rating":{"time_to_table":0,"value_for_money":3,"innovation":2,"plating_decoration":2,"taste":4}}] 
 

 
var result = _.reduce(data, function(r, e, i) { 
 
    if(i != 0) _.mergeWith(r.rating, e.rating, (a, b) => a + b) 
 
    return r; 
 
}, data[0]) 
 

 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

0

可以使用Array#reduce()Object.keys()

const data = [{rating:{time_to_table:5,value_for_money:5,innovation:5,plating_decoration:5,taste:5}},{rating:{time_to_table:0,value_for_money:3,innovation:2,plating_decoration:2,taste:4}}]; 
 

 
let finalObject = data.reduce((o, c) => { 
 
    Object.keys(c.rating).forEach(k => { 
 
    o.rating[k] = o.rating[k] || 0; 
 
    o.rating[k] += c.rating[k]; 
 
    }); 
 
    return o; 
 
}, { rating: {} }) 
 

 
console.log(finalObject);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

您可以使用減少,並且在你的對象希望有儘可能多的財產做。

以下功能不需要知道那種你逝去的對象的任何東西,因爲沒有硬編碼性能

const arr = [{ 
 
    "rating": { 
 
     "time_to_table": 5, 
 
     "value_for_money": 5, 
 
     "innovation": 5, 
 
     "plating_decoration": 5, 
 
     "taste": 5 
 
    }, 
 
    a: {b: 1, c: 2} 
 
}, { 
 
    "rating": { 
 
     "time_to_table": 0, 
 
     "value_for_money": 3, 
 
     "innovation": 2, 
 
     "plating_decoration": 2, 
 
     "taste": 4 
 
    }, 
 
    a: {b: 3, c: 0} 
 
}]; 
 

 
const result = arr.reduce(fn, {}) 
 

 
function fn (acc, val) { 
 
    for (let x in val) { 
 
    acc[x] = acc[x] || {}; 
 
    for (let y in val[x]) { 
 
     acc[x][y] = acc[x][y] || 0; 
 
     acc[x][y] += val[x][y]; 
 
    } 
 
    } 
 
    
 
    return acc; 
 
} 
 

 
console.log(result)

0

Array#reduce溶液。

var arr = [{"rating":{"time_to_table":5,"value_for_money":5,"innovation":5,"plating_decoration":5,"taste":5}},{"rating":{"time_to_table":0,"value_for_money":3,"innovation":2,"plating_decoration":2,"taste":4}}], obj = arr[0]; arr.splice(0,1); 
 

 
var res = arr.reduce(function(s, a) { 
 
    Object.keys(a.rating).forEach(function(v) { 
 
    s.rating[v] += a.rating[v]; 
 
    }) 
 
    return s; 
 
}, obj); 
 

 
console.log(res);

0

你可以使用任意嵌套對象的遞歸方法,收集和中的對象和值。

var data = [{ rating: { time_to_table: 5, value_for_money: 5, innovation: 5, plating_decoration: 5, taste: 5 } }, { rating: { time_to_table: 0, value_for_money: 3, innovation: 2, plating_decoration: 2, taste: 4 } }], 
 
    result = data.reduce(function iter(target, source) { 
 
     Object.keys(source).forEach(function (k) { 
 
      if (source[k] && typeof source[k] === 'object') { 
 
       iter(target[k] = target[k] || {}, source[k]); 
 
       return; 
 
      } 
 
      target[k] = (target[k] || 0) + +source[k]; 
 
     }); 
 
     return target; 
 
    }, {}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }