检查嵌套对象数组中的重复 属性 值
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);
我有一个 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);