簡體   English   中英

檢查還包含嵌套的 arrays 和對象的對象數組是否相同,如果是,則將它們合並為一個 object 並將鍵添加到一起

[英]Check if array of objects, which also contain nested arrays with objects, are the same, if so, combine them into one object and add the keys together

我需要檢查“食物”數組中的對象是否彼此相等,以及那些 - 組合成一個添加量和 mody.amount 並保持 rest 不變。 這只是為了更好地顯示訂單數據。 我嘗試使用 lodash 庫和 reduce,但我不知道如何構造這個嵌套對象(mody)也添加值的 function,如果 isEqual 返回 false,請保留 object,同時連接相同的對象。

我嘗試了什么:

obj1.reduce((prev, next) => _.isEqual(prev, next) ? {...prev, amount: prev.amount + next.amount} : next

現在看起來像這樣:

 const food =  [
    {
        "id": 1,
        "name": "chicken",
        "price": 6,
        "amount": 1,
        "mody": [
            {
                "id": 33,
                "name": "cheese",
                "price": 1,
                "amount": 1
            },
            {
                "id": 34,
                "name": "chips",
                "price": 2,
                "amount": 1
            }
        ]
    },
    {
        "id": 1,
        "name": "chicken",
        "price": 6,
        "amount": 1,
        "mody": [
            {
                "id": 33,
                "name": "cheese",
                "price": 1,
                "amount": 1
            },
            {
                "id": 34,
                "name": "chips",
                "price": 2,
                "amount": 1
            }
        ]
    },
    {
        "id": 2,
        "name": "pizza",
        "price": 6,
        "amount": 2,
        "mody": [
            {
                "id": 12,
                "name": "extra cheese",
                "price": 2,
                "amount": 1
            }
        ]
    }
]
  

並且需要這樣的東西:

const food = [
    {
        "id": 1,
        "name": "chicken",
        "price": 6,
        "amount": 2,
        "mody": [
            {
                "id": 33,
                "name": "cheese",
                "price": 1,
                "amount": 2
            },
            {
                "id": 34,
                "name": "chips",
                "price": 2,
                "amount": 2
            }
        ]
    },
    {
        "id": 2,
        "name": "pizza",
        "price": 6,
        "amount": 2,
        "mody": [
            {
                "id": 12,
                "name": "extra cheese",
                "price": 2,
                "amount": 1
            }
        ]
    }
]
  

對食物量和mod量求和的算法幾乎相同,不同之處在於對於具有相同id的每種食物,我們將求和mody量。 為了使算法更簡單,我使用字典作為reduce function 的累加器,因此每個鍵都有一個唯一元素。 這個元素將是我們最后的食物或食物與金額的總和。

么和算法:

const sumMody = (modyAccumulator, currentMody) => {
  //Get the stored mody in the accumulator dictionary or null if it the mody is not stored
  const storedMody = modyAccumulator[currentMody.id] ?? null 
  
  // if mody is null then add mody to the dictionary using its id as key
  if (!storedMody) {
    modyAccumulator[currentMody.id] = currentMody
  } else {
    //Mody is stored then sum amount
    storedMody.amount += currentMody.amount
  }

  return modyAccumulator
}

食物總和算法與sumMody相同,唯一的區別是當食物相等時它調用sumMody function:

const sumFood = (foodAccumulator, currentFood) => {
  //Get the stored foodin the accumulator dictionary or null if it the food is not stored
  const storedFood = foodAccumulator[currentFood.id] ?? null

  // if food is null then add food to the dictionary using its id as key
  if (!storedFood) {
    foodAccumulator[currentFood.id] = currentFood
  } else {
    //Food is stored then sum food amount
    storedFood.amount += currentFood.amount

    //Create a list with mody from both foods
    const modyList = [...storedFood.mody, ...currentFood.mody]

    //Use reduce passing the sumMody callback function and initialize the accumulator with a dictionary
    const modySumDictionary = modyList.reduce(sumMody, {})

    /* The function above return a dictionary where the identifier is the mody.id 
      and the value is the mody. We only need the values from that dictionary so 
      we use Object.values to extract all the values. */
    storedFood.mody = Object.values(modySumDictionary)
  }

  return foodAccumulator
}

要執行兩個總和:

//As explained before the reduce function will return a dictionary so we use Object.values to get only the values
const result = Object.values(food.reduce(sumFood, {}))

console.log(result)

沒有評論的算法:

const sumMody = (modyAccumulator, currentMody) => {
  const storedMody = modyAccumulator[currentMody.id] ?? null
  if (!storedMody) {
    modyAccumulator[currentMody.id] = currentMody
  } else {
    storedMody.amount += currentMody.amount
  }

  return modyAccumulator
}

const sumFood = (foodAccumulator, currentFood) => {
  const storedFood = foodAccumulator[currentFood.id] ?? null
  if (!storedFood) {
    foodAccumulator[currentFood.id] = currentFood
  } else {
    storedFood.amount += currentFood.amount

    const modyList = [...storedFood.mody, ...currentFood.mody]

    const modySumDictionary  = modyList.reduce(sumMody, {})
    storedFood.mody = Object.values(modySumDictionary)
  }

  return foodAccumulator
}

const result = Object.values(food.reduce(sumFood, {}))

console.log(result)

參考Object.values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM