在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数组中合并/推送重复值[关闭]

javascript更改数组中的元素[重复]

javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]

如何在php中更改数组推送的结果[重复]

如何遍历类对象数组并在 JavaScript 中使用函数 [重复]

Firebase 推送数组 - Javascript