将对象添加到数组而不覆盖

Posted

技术标签:

【中文标题】将对象添加到数组而不覆盖【英文标题】:add objects to array without overwriting 【发布时间】:2022-01-20 14:28:39 【问题描述】:

我有我当前的代码

let array = ;
          array[date] = [
            
              Name: Name,
              Cell: Cell,
              Age: Age,
              userId: userId,
              Time: time,
              Type: type,
              read: false,
            ,
          ];

像这样上传到firebase

但每次我为同一日期添加新条目时,它都会覆盖现有数据。我希望将数据添加到地图“1”等,而不是覆盖地图“0”中的数据

更新:我已尝试以下操作,但收到错误消息。不知道我这样做是否正确,我还在学习。

 let array = ;
          array[date] = [];
          try 
            await firebase
              .firestore()
              .collection("Notifications")
              .doc(`$helper`)
              .update(
                
                  array: firebase.firestore.FieldValue.arrayUnion(
                    Name: Name,
                    Cell: Cell,
                    Age: Age,
                    userId: userId,
                    Time: time,
                    Type: type,
                    read: false,
                  ),
                ,

                 merge: true 
              );
           catch (e) 
            alert(e);
            console.log(e);
          

通过推送更新:

 // at beginning of script
          let array = ;

          // later, when you want to add to it
          if (!array[date]) 
            array[date] = [];
          
          array[date].push(
            Name: Name,
            Cell: Cell,
            Age: Age,
            userId: userId,
            Time: time,
            Type: type,
            read: false,
          );

    

          try 
            await firebase
              .firestore()
              .collection("Notifications")
              .doc(`$helper`)
              .set(
                array,

                 merge: true 
              );
           catch (e) 
            alert(e);
            console.log(e);
          
        ,

解决方案:

try 
  await firebase
    .firestore()
    .collection("Notifications")
    .doc(`$helper`)
    .update(
      [date]: firebase.firestore.FieldValue.arrayUnion(
        Name: Name,
        Cell: Cell,
        Age: Age,
        userId: userId,
        Time: time,
        Type: type,
        read: false,
      ),
    );
 catch (e) 
  alert(e);
  console.log(e);

【问题讨论】:

你能分享你的代码没有按预期工作吗? 这是一个对象,而不是一个数组。 @Dharmaraj 我已经更新了问题 去掉merge: true...只有在使用set()时才能使用 使用第一个,但要么将update 更改为set,要么从更新中删除merge: true 【参考方案1】:

由于您设置了整个 2022-01-03 字段,因此您将覆盖该字段中的所有现有值。

如果您想将您指定的新值/对象与字段use the array-union operator 中的现有值合并。

【讨论】:

感谢您的回复,我已经用我的尝试和您的解决方案更新了原始问题。我收到一个错误 一旦我想通了,数组联合就成功了,谢谢!【参考方案2】:

使用push() 添加到数组中。

// at beginning of script
let array = ;

// later, when you want to add to it
if (!array[date]) 
  array[date] = [];

array[date].push(
  Name: Name,
  Cell: Cell,
  Age: Age,
  userId: userId,
  Time: time,
  Type: type,
  read: false,
);

【讨论】:

感谢您的回复,我已经尝试过您的解决方案,但仍然覆盖数据 你应该只在脚本开头有一次let array = 。其他部分是每次你想添加东西时完成的。 我已经用您的解决方案更新了原始问题,如果您可以查看的话。它仍在覆盖数据。我做对了吗? 我不知道 firebase,所以我无法帮助您解决这部分问题。但是,每当您说遇到错误时,您都需要发布确切的错误消息。

以上是关于将对象添加到数组而不覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:重构对象数组而不覆盖键

将字符串添加到文件而不覆盖以前的字符串

更新反应状态而不覆盖先前的状态

For..In 循环覆盖所有数组值

将字符串“temp”值的每个新值添加到 ArrayList 而不覆盖以前的“temp”

如何使用 PlistBuddy 添加设置而不覆盖现有设置?