我写了一个小应用程序,它有一个食谱数组,每个食谱都有一个配料子数组,我想做的是遍历所有食谱中的所有配料,找出唯一的配料。
目前我有一个函数,它可以迭代所有配方中的所有成分,然后将该成分的一个空版本添加到集合中。这 * 应该 * 可以工作,但当我记录结果时,它没有意义,因为添加到集合中的成分都被填充了-它们没有使用我创建的空对象。因为嵌套属性不同,这意味着集合多次添加配料,因为对象不相等。
然后,我重新循环成分,计算值,但这应该只发生在日志记录器条目 * 之后 *。所以,我不明白在调用该功能之前,值是如何填充的?
这是我目前拥有的:
calculate(recipes: Recipe[]): Observable<Calculation[]> {
let calculations: Calculation[] = [];
let uniqueIngredients = new Set();
for (let i = 0; i < recipes.length; i++) {
for (let j = 0; j < recipes[i].ingredients.length; j++) {
// First get all the unique ingredients
uniqueIngredients.add(this.getEmptyIngredient(recipes[i].ingredients[j]));
}
}
console.log('unique ingredients', uniqueIngredients);
let $this = this;
uniqueIngredients.forEach(function (value) {
let ingredientCalculation = value as Calculation;
for (let i = 0; i < recipes.length; i++) {
for (let j = 0; j < recipes[i].ingredients.length; j++) {
if (ingredientCalculation.ingredient.definition.name === recipes[i].ingredients[j].definition.name) {
// Calculation already exists so update it
let calculation: Calculation = $this.calculateIngredient(recipes[i].ingredients[j], recipes[i].quantity);
ingredientCalculation.quantityMeasurement += calculation.quantityMeasurement;
ingredientCalculation.quantityUnits += calculation.quantityUnits;
ingredientCalculation.totalCost += calculation.totalCost;
}
}
}
calculations.push(ingredientCalculation);
});
return of(calculations);
}
private getEmptyIngredient(ingredient: Ingredient): Calculation {
let calculation: Calculation = {
ingredient: ingredient,
quantityUnits: 0,
quantityMeasurement: 0,
totalCost: 0
};
return calculation;
}
当我查看控制台时,结果如下:
从我的代码来看,我本以为只有一个所有属性都设置为0的“Apple”示例,但事实并非如此。
有人能给我解释一下我错在哪里吗?
**EDIT:**我理解关于对象相等的注解,但我不理解的是对象应该为空:在控制台进行日志记录时,collect应该包含空对象--为什么所有计算逻辑都发生在日志之后,而这些对象却全部填充?
1条答案
按热度按时间xxslljrj1#
正如VLAZ所说,对象相等并不像你想象的那样,两个具有相同属性的对象仍然是不相等的,除非它们引用内存中的同一个对象。
相反,你的用例提供了某种成分ID吗?如果是这样,你可以使用Map和
myMap.set(ingredientID, ingredientObjectReference)
。你将只得到唯一的成分,因为重复的成分只会重置以前设置的键。