2017-08-04 121 views
0

我有一個複雜的JavaScript對象。Sum複雜的JavaScript對象屬性

var obj = {foo: {bar: {baz1 : {price: 200},baz2: {price: 300}}}; 

我怎樣才能得到價格屬性的總和呢? 感謝

+0

我覺得遞歸函數是一展身手。只需檢查自己的財產,再爲每個財產再次調用等等。如果沒有,那麼你必須自己拆分圖層 –

+0

爲什麼你認爲它很複雜,是否有任何遞歸的需要?通常可以用這種方式完成'(obj.foo.bar.baz1.price + obj.foo.bar.baz2.price)' – brk

+0

確實有需要。因爲有很多baz物體。 baz1:{price:200},baz2:{price:200},...,baz100:{price:200} – Artdark92

回答

2

試試這個

var sum = 0; 

for(var i in obj.foo.bar){ 

sum += obj.foo.bar[i].price; 

} 

console.log(sum); 
+0

它的工作原理。但是,foo和bar的屬性名稱可能會更改,並且此解決方案不起作用。 無論如何,非常感謝您的答案! – Artdark92

0

這裏是一個遞歸做的另一個功能。有關詳細信息,請檢查getPriceSum()函數的代碼 - 使用reduce方法和遞歸調用完成該魔法。

var obj = { 
 
    foo: { 
 
    bar: { 
 
     baz1: { 
 
     price: 200 
 
     }, 
 
     baz2: { 
 
     price: 300 
 
     } 
 
    } 
 
    } 
 
}; 
 

 
var priceSum = getPriceSum(obj); 
 
console.log('Sum of prices is ' + priceSum); 
 

 
var obj = { 
 
    foo: { 
 
    price: 100, 
 
    bar: { 
 
     baz1: { 
 
     price: 200 
 
     }, 
 
     baz2: { 
 
     price: 300 
 
     }, 
 
     baz3: { 
 
     price: 250 
 
     }, 
 
    } 
 
    } 
 
}; 
 

 
var priceSum = getPriceSum(obj); 
 
console.log('Another test - prices is ' + priceSum); 
 

 
function getPriceSum(obj) { 
 
    var sum = Object.keys(obj).reduce(function(sum, prop) { 
 
    if(typeof obj[prop] === 'object'){ 
 
     return sum + getPriceSum(obj[prop]); 
 
    } 
 
    if(prop === 'price'){ 
 
     return sum + obj[prop]; 
 
    } 
 
    }, 0); 
 
    return sum; 
 
}

+0

工作正常!非常感謝! – Artdark92

+0

聽起來不錯!我很高興這段代碼對你有幫助。祝你好運! – codtex

0

jQuery的

var sum = 0 

$.each(obj.foo.bar, function(index, value) { 
    sum += value.price 
}); 

console.log(sum) 

只有JavaScript:

var sum = 0 

Object.keys(obj.foo.bar).map(function(objectKey, index) { 
    var value = obj.foo.bar[objectKey]; 
    sum += value.price 
}); 

console.log(sum) 
+0

它的工作原理。但是,foo和bar的屬性名稱可能會更改,並且此解決方案不起作用。 無論如何,非常感謝您的答案! – Artdark92

0

你可以嘗試遞歸函數尋找到的每個屬性的。

var sum = 0; 
function recursive(obj) { 
    $.each(obj, function(key, value) { 
     if (typeof value === "object") { //is it an object? 
      recursive(value); 
     } else { 
      sum += parseFloat(value); //if value is string, this will be 0 
     } 
    } 
} 
+0

非常感謝!工作正常! – Artdark92

0

您可以使用兩步法找到具有給定屬性名稱的所有值,然後聚合此值。

function getValues(object, key) { 
 
    return Object.keys(object).reduce(function (r, k) { 
 
     if (object[k] && typeof object[k] === 'object') { 
 
      return r.concat(getValues(object[k], key)); 
 
     } 
 
     if (k === key) { 
 
      r.push(object[k]); 
 
     } 
 
     return r; 
 
    }, []); 
 
} 
 

 
var object = { foo: { bar: { baz1: { price: 200 }, baz2: { price: 300 } } } }, 
 
    result = getValues(object, 'price').reduce((a, b) => a + b); 
 

 
console.log(result);

+0

工作正常!非常感謝! – Artdark92