2017-02-21 49 views
2

我有以下對象,我想總結相同成分名稱的值,如:番茄:5,雞:5,大米:1,豌豆:1,我有這個代碼,但沒有作出總和,而是顯示所有對象Javascript對象相同屬性鍵的總和值

var data3 = { 
    "menus": [{ 
    "recipe": "chicken with rice", 
    "ingredients": [{ 
     "name": "tomato", 
     "value": 2 
    }, { 
     "name": "chicken", 
     "value": 3 
    }, { 
     "name": "rice", 
     "value": 1 
    }] 
    }, { 
    "recipe": "Garden rice", 
    "ingredients": [{ 
     "name": "tomato", 
     "value": 3 
    }, { 
     "name": "chicken", 
     "value": 2 
    }, { 
     "name": "peas", 
     "value": 1 
    }] 
    }] 
}; 

var ingredients; 

for (var i = 0; i < 10; i++) { 
    ingredients = data3.menus[i].ingredients; 

    var temp = {}; 
    var obj = null; 
    for (var j = 0; j < ingredients.length; j++) { 
    obj = ingredients[j]; 

    if (!temp[obj.name]) { 
     temp[obj.name] = obj; 
    } else { 
     temp[obj.name].value += obj.value; 
    } 

    } 
    var result = []; 
    for (var prop in temp) 
    result.push(temp[prop]); 

    console.log(result); 

}; 

我會感謝您的幫助,謝謝!

+0

的'+ = obj.value'行是一個你在哪裏和總結了如果對象已經存在於臨時對象中,則返回值。但是,每次迭代主對象中的食譜時,您的'temp'對象將被替換爲一個新對象'{}'。 嘗試移動'temp'變量以在初始化'ingredients'變量時對其進行初始化,並且您應該以每個對象的值的總和結束對象。 –

回答

4

如果某個屬性不存在,您可以使用一個帶有配料名稱的散列表,並使用默認值零。然後添加該值。

var data3 = { menus: [{ recipe: "chicken with rice", ingredients: [{ name: "tomato", value: 2 }, { name: "chicken", value: 3 }, { name: "rice", value: 1 }] }, { recipe: "Garden rice", ingredients: [{ name: "tomato", value: 3 }, { name: "chicken", value: 2 }, { name: "peas", value: 1 }] }] }, 
 
    ingredients = Object.create(null); 
 

 
data3.menus.forEach(function (a) { 
 
    a.ingredients.forEach(function (b) { 
 
     ingredients[b.name] = (ingredients[b.name] || 0) + b.value; 
 
    }); 
 
}); 
 

 
console.log(ingredients);

+0

正在工作,謝謝! – anabv

0

你的實現是正確的,只是你重新初始化一次又一次的溫度。所以你只需要從你的循環中取出溫度。

var data3 = { 
    "menus": [{ 
    "recipe": "chicken with rice", 
    "ingredients": [{ 
     "name": "tomato", 
     "value": 2 
    }, { 
     "name": "chicken", 
     "value": 3 
    }, { 
     "name": "rice", 
     "value": 1 
    }] 
    }, { 
    "recipe": "Garden rice", 
    "ingredients": [{ 
     "name": "tomato", 
     "value": 3 
    }, { 
     "name": "chicken", 
     "value": 2 
    }, { 
     "name": "peas", 
     "value": 1 
    }] 
    }] 
}; 

var ingredients; 
var temp = {}; 
for (var i = 0; i < data3.menus.length; i++) { 
    ingredients = data3.menus[i].ingredients; 

    var obj = null; 
    for (var j = 0; j < ingredients.length; j++) { 
    obj = ingredients[j]; 


    if (!temp[obj.name]) { 
     temp[obj.name] = obj; 
    } else { 
     temp[obj.name].value += obj.value; 
    } 
    } 
}; 

var result = []; 
    for (var prop in temp) 
    result.push(temp[prop]); 
    console.log(result); 
0

您可以創建將遍歷所有的成分,如果ingredient.name已給定的名稱,然後添加ingredient.value到您的結果的功能。這裏是用箭頭功能ES2015溶液:

const sumIngredients = (menus, name) => { 
    let result = 0; 
    menus.forEach(meal => { 
    meal.ingredients.forEach(ingredient => { 
     if (ingredient.name === name) { 
     result += ingredient.value; 
     } 
    }) 
    }) 
    return result; 
} 

使用它:

sumIngredients(data3.menus, 'chicken'); //5 
sumIngredients(data3.menus, 'tomato'); //5 
sumIngredients(data3.menus, 'rice'); //1 
sumIngredients(data3.menus, 'peas'); //1 

工作實施例:https://jsfiddle.net/sc8wrupk/

相關問題