检查嵌套对象数组中的重复 属性 值

Checking for duplicate property values in an array of nested objects

我有一个 JSON 文件,其中包含一个包含嵌套对象的数组和模拟购物车的数组。我想检查是否有重复值,如果有,请更新商品的数量值,否则,只需将商品添加到购物车即可。

这是 JSON 文件:

[
    {
        "email": "tshepo@email.com",
        "status": "OPEN",
        "items": [
            {
                "name": "hamster",
                "quantity": 2,
                "price": 20
            },
            {
                "name": "saw dust",
                "quantity": 1,
                "price": 20
            },
            {
                "name": "hamster-cage",
                "quantity": 1,
                "price": 150
            },
            {
                "name": "book: how to care for your hamster",
                "quantity": 1,
                "price": 150
            },
            {
                "name": "hamster-cage",
                "quantity": 1,
                "price": 150
            }
        ]
    }
]

这是我到目前为止所做的:

const data = require("./data.json");

function checkIfPresent(key){
    let ans = data.findIndex((obj) => Object.values(obj).includes(key))
    return ans;
}

for(let x = 0; x < data.length; x++)
{
    let arr;
    if(checkIfPresent(data[x].items)){
        arr[ans].quantity += data[x].items.quantity;
    }else{
        arr.push(data[x].items);
    }
}

代码无法正常工作,请帮助。

你的代码中有不少错误,我已经修正了。最让您感到困惑的是,您有一个包含单个项目的数组,这是一个对象,它有一个 items 成员,它也是一个数组。因此,我们需要引用 data[0].items[x] 而不是 data[x]。此外,在您的 checkIfPresent 函数中,您检查了 data 是否包含该项目,这显然是正确的。总是。相反,您想检查是否已经处理了一个同名的项目,因此您需要检查 arr 是否已经有这个值。最后,arr 在循环的每次迭代中都被初始化,这会删除之前迭代中存储的所有内容,并使其在循环外不可访问。我将初始化移到了循环之外。另外,由于您的 data 有一个数组,看来您可能有多次购物。在这种情况下,您可以在已有的循环周围包装另一个循环,并循环 data 的主索引。

let data = [
    {
        "email": "tshepo@email.com",
        "status": "OPEN",
        "items": [
            {
                "name": "hamster",
                "quantity": 2,
                "price": 20
            },
            {
                "name": "saw dust",
                "quantity": 1,
                "price": 20
            },
            {
                "name": "hamster-cage",
                "quantity": 1,
                "price": 150
            },
            {
                "name": "book: how to care for your hamster",
                "quantity": 1,
                "price": 150
            },
            {
                "name": "hamster-cage",
                "quantity": 1,
                "price": 150
            }
        ]
    }
]
function checkIfPresent(key, array){
    let ans = array.findIndex((obj) => obj.name === key)
    return ans;
}

let arr = [];var ans;
for(let x = 0; x < data[0].items.length; x++)
{
    if((ans = checkIfPresent(data[0].items[x].name, arr)) >= 0){
        arr[ans].quantity += data[0].items[x].quantity;
    }else{
        arr.push(data[0].items[x]);
    }
}
console.log(arr);