我有一個複雜的JavaScript對象。Sum複雜的JavaScript對象屬性
var obj = {foo: {bar: {baz1 : {price: 200},baz2: {price: 300}}};
我怎樣才能得到價格屬性的總和呢? 感謝
我有一個複雜的JavaScript對象。Sum複雜的JavaScript對象屬性
var obj = {foo: {bar: {baz1 : {price: 200},baz2: {price: 300}}};
我怎樣才能得到價格屬性的總和呢? 感謝
試試這個
var sum = 0;
for(var i in obj.foo.bar){
sum += obj.foo.bar[i].price;
}
console.log(sum);
它的工作原理。但是,foo和bar的屬性名稱可能會更改,並且此解決方案不起作用。 無論如何,非常感謝您的答案! – Artdark92
這裏是一個遞歸做的另一個功能。有關詳細信息,請檢查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;
}
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)
它的工作原理。但是,foo和bar的屬性名稱可能會更改,並且此解決方案不起作用。 無論如何,非常感謝您的答案! – Artdark92
你可以嘗試遞歸函數尋找到的每個屬性的。
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
}
}
}
非常感謝!工作正常! – Artdark92
您可以使用兩步法找到具有給定屬性名稱的所有值,然後聚合此值。
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);
工作正常!非常感謝! – Artdark92
我覺得遞歸函數是一展身手。只需檢查自己的財產,再爲每個財產再次調用等等。如果沒有,那麼你必須自己拆分圖層 –
爲什麼你認爲它很複雜,是否有任何遞歸的需要?通常可以用這種方式完成'(obj.foo.bar.baz1.price + obj.foo.bar.baz2.price)' – brk
確實有需要。因爲有很多baz物體。 baz1:{price:200},baz2:{price:200},...,baz100:{price:200} – Artdark92