在Javascript中推送不重复的数组并更改对象的属性值?
Posted
技术标签:
【中文标题】在Javascript中推送不重复的数组并更改对象的属性值?【英文标题】:Pushing array without duplicate and change the property value of object in Javascript? 【发布时间】:2021-12-01 08:15:19 【问题描述】:我有一个对象,我正在推入数组,同时推入我需要限制重复项,如果属性有任何更改,则相应地更新数组?
[
Id: "a134",
Name: "Name -",
Company: "001",
Product :"01"
quantity :1
,
Id: "a135",
Name: "Name -1",
Company: "002",
Product :"03"
quantity :2 -----> (Previous event.target.name)
,
Id: "a135",
Name: "Name -1",
Company: "002",
Product :"03"
quantity :3 ---> (current event.target.name)
]
如果我推入数组,可能有机会更新数量如何实现以下结果
[
Id: "a134",
Name: "Name -",
Company: "001",
Product :"01"
quantity :1
,
Id: "a135",
Name: "Name -1",
Company: "002",
Product :"03"
quantity :3 ---> (current event.target.name)
]
现在我的代码是
if(event.target.value!='')
const searchObj = this.myList.find(( Id,Product, Company ) => Product === index);
if (searchObj)
console.log('searchObj',searchObj);
resultVal = ...searchObj, quantity:parseInt(event.target.value);
if (!this.newProductList.some(e => e.Product === resultVal.Product))
this.newProductList.push(resultVal);
【问题讨论】:
也许使用find
而不是some
。如果返回 undefined
,则它不在 productList 中,因此将对象推送到 productList。 ELSE返回找到的对象,给quantity
加一
那么最好不要使用数组结构,而是使用普通对象,以Id
为键。
【参考方案1】:
我认为数组是错误的数据类型。我更喜欢使用map。
这当然只有在 Id 唯一的情况下才有效,因为这是最好用作键的:
const myMap = new Map([["a134",
Name: "Name -",
Company: "001",
Product :"01",
quantity :1
]]);
然后在更新数量或添加新项目之前,很容易检查项目是否已经存在。
const id = "a134"; // or "a135" for a new entry
const newItem = Name: "Name B",
Company: "002",
Product :"012",
quantity :1
if(myMap.has(id))
const item = myMap.get(id);
myMap.set(id, ...item, quantity: item.quantity +1)
else
myMap.set(id,newItem);
console.log(myMap) // Map 'a134' => Name: 'Name A', Company: '001', Product:'01', quantity: 2
【讨论】:
我尝试了您的方法,但 myMap 我需要推回列表,但它会再次添加一个条目 newProductList.push(myMap.values()) 为什么需要将地图值推送到数组中?我宁愿保留地图,然后在需要时 iterate over the map:【参考方案2】:这最好通过使用不同的数据结构来解决:使用普通对象,以Id
为键:
let data =
"a134":
Id: "a134"
Name: "Name -",
Company: "001",
Product: "01"
quantity: 1
,
"a135":
Id: "a135",
Name: "Name -1",
Company: "002",
Product: "03"
quantity: 2
,
;
更新/添加不要推送,而是设置对象键的值。例如:
// Let's say we want to add/update with this object:
let objToAdd =
Id: "a135",
Name: "Name -1",
Company: "002",
Product: "03"
quantity: 3
// ...then just do:
data[objToAdd.Id] = objToAdd;
这将更新或“插入”。在上述情况下,它将更新:
let data =
"a134":
Id: "a134"
Name: "Name -",
Company: "001",
Product: "01"
quantity: 1
,
"a135":
Id: "a135",
Name: "Name -1",
Company: "002",
Product: "03"
quantity: 3
,
;
如果您需要数组格式,那么就这样做:
let arr = Object.values(data);
...但是尝试坚持使用数组是低效代码的保证。它只是不适合这里的工作。您应该调整您的代码以始终使用纯对象表示。您可以迭代对象中的值,可以从对象中删除项目、更新、添加等。
【讨论】:
先生,我如何保留这两个更新的对象,因为我在 onchange 函数中执行此操作 您最好调整您的代码以仅与对象一起使用。数组确实不是正确的数据结构,如果您尝试以某种方式坚持使用数组并保持事物的唯一性,那么您的代码将效率低下。你可以迭代一个对象,所以这里真的没有很好的理由想要一个数组。以上是关于在Javascript中推送不重复的数组并更改对象的属性值?的主要内容,如果未能解决你的问题,请参考以下文章
javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]