從對象數組中取出某個屬性相同的對象

輸入:
[
{ type: "a", value: 1 },
{ type: "b", value: 2 },
{ type: "a", value: 3 },
{ type: "b", value: 9 }
]

目標:
[
{ type: "a", value: 4 },
{ type: "b", value: 11 }
]


思路一(較簡便)
function sumByType(arr) {
    let obj = {}
    arr.forEach((item) => {
        console.log(obj, item.type, item.value)
        if (obj[item.type] !== undefined) {
            obj[item.type] += item.value
        } else {
            obj[item.type] = item.value
        }
    })
    return Object.keys(obj).map((key) => {
        return {
            type: key,
            value: obj[key]
        }
    })
}

sumByType([
        { type: "a", value: 1 },
        { type: "b", value: 2 },
        { type: "a", value: 3 },
        { type: "b", value: 9 }
    ])
思路二
function sumByType(arr) {
    if (arr.length === 0) return arr
    if (!Array.isArray(arr)) return arr
    if (
        !arr.every(
            (item) =>
                item.type &&
                item.value &&
                typeof item.type == "string" &&
                item.type.constructor == String &&
                typeof item.value == "number"&&
                !isNaN(item.value)
        )
    ) {
        return arr
    }

    let types = arr.map((item) => {
        return item.type
    })
    types = Array.from(new Set(types))
    return types.map((type) => {
        let sametypeArr = arr.filter((item) => item.type === type)
        return sametypeArr.reduce(
            (pre, cur, index) => {
                cur.value = pre.value + cur.value
                return cur
            },
            { type: sametypeArr[0].type, value: 0 }
        )
    })
}

sumByType( [{type: 'a', value: 1}, {type: 'b', value: 2}, {type: 'a', value: 3}, {type: 'b', value: 9}])

思路二解析

  • 1.先判斷參數格式是否符合標準
  • 2.遍歷數組得到所有的type并去重 =>獲得types:[ 'a', 'b' ]
  • 3.遍歷arr,把type相同的對象取出作為新的數組 =>獲得sametypeArr:如[ { type: 'a', value: 1 }, { type: 'a', value: 3 } ]的數組
  • 4.遍歷sametypeArr把value相加獲得某個type的對象{ type: 'a', value: 4 }
  • 5.返回這個對象組成新的數組,即所求結果
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容