typescript 如何正确地将唯一对象添加到集合?

mrwjdhj3  于 2023-02-25  发布在  TypeScript
关注(0)|答案(1)|浏览(169)

我写了一个小应用程序,它有一个食谱数组,每个食谱都有一个配料子数组,我想做的是遍历所有食谱中的所有配料,找出唯一的配料。
目前我有一个函数,它可以迭代所有配方中的所有成分,然后将该成分的一个空版本添加到集合中。这 * 应该 * 可以工作,但当我记录结果时,它没有意义,因为添加到集合中的成分都被填充了-它们没有使用我创建的空对象。因为嵌套属性不同,这意味着集合多次添加配料,因为对象不相等。
然后,我重新循环成分,计算值,但这应该只发生在日志记录器条目 * 之后 *。所以,我不明白在调用该功能之前,值是如何填充的?
这是我目前拥有的:

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应该包含空对象--为什么所有计算逻辑都发生在日志之后,而这些对象却全部填充?

xxslljrj

xxslljrj1#

正如VLAZ所说,对象相等并不像你想象的那样,两个具有相同属性的对象仍然是不相等的,除非它们引用内存中的同一个对象。
相反,你的用例提供了某种成分ID吗?如果是这样,你可以使用Map和myMap.set(ingredientID, ingredientObjectReference)。你将只得到唯一的成分,因为重复的成分只会重置以前设置的键。

相关问题