推送到数组时,值被重复

Posted

技术标签:

【中文标题】推送到数组时,值被重复【英文标题】:Values are being duplicated when being pushed to array 【发布时间】:2021-03-17 03:44:03 【问题描述】:

当我运行此代码时,我得到所有条目的最后一个元素重复。我正在尝试在不和谐中添加一个新角色,并将一些关于角色详细信息 idk 的条目保存到我的 json 文件中,但我似乎做不到。

我已经添加了数据和列表变量的声明。

let data = fs.readFileSync('roles.json')
var list = JSON.parse(data)
var details = nickname:"",channel:"",message:"",role:"",emoji:"",raw:"",error:""
let sections = ['A','B','C','D']
var bar = new Promise((resolve, reject) => 
            sections.forEach(async function (value, index, array) 
                    let role = await message.guild.roles.create( data:  name: `Section $value`  )
                    details.nickname = value
                    details.channel = '12345567'
                    details.message = '1233454676'
                    details.role = role.id
                    details.error = '12443566'
                    list.push(details)
                    if (index === array.length - 1)
                        resolve()
                );
        );
        
        bar.then(() => 
            console.log(list);
        );

输出

[
  
    nickname: '', 
    channel: '',  
    message: '',  
    role: '',     
    emoji: '',    
    raw: '',      
    error: ''     
  ,
  
    nickname: 'D',
    channel: '12345567',
    message: '1233454676',
    role: '784672976855498813',
    emoji: '',
    raw: '',
    error: '12443566'
  ,
  
    nickname: 'D',
    channel: '12345567',
    message: '1233454676',
    role: '784672976855498813',
    emoji: '',
    raw: '',
    error: '12443566'
  ,
  
    nickname: 'D',
    channel: '12345567',
    message: '1233454676',
    role: '784672976855498813',
    emoji: '',
    raw: '',
    error: '12443566'
  ,
  
    nickname: 'D',
    channel: '12345567',
    message: '1233454676',
    role: '784672976855498813',
    emoji: '',
    raw: '',
    error: '12443566'
  
]

【问题讨论】:

什么是details,它在哪里声明? var details = nickname:'',channel:'',message:'',role:'',emoji:'',raw:'',error:'' 声明于顶部 在将同一个对象推入list 数组之前,您似乎在反复对其进行变异。 那么我该如何解决这个问题? 请用detailslist 的声明更新您的问题 【参考方案1】:

在将同一对象的引用推入list 数组之前,您正在重复地改变同一个对象。

在每次迭代的 forEach 回调中声明一个新的 details 对象...

let sections = ['A', 'B', 'C', 'D']
const list = []

sections.forEach((value) => 
  const details = 
  details.nickname = value
  list.push(details)
);

console.log(list)

...或者如果上述方法不可行,则将details 对象的克隆推送到list,而不是对原始details 对象的引用。

let sections = ['A', 'B', 'C', 'D']
const list = []
const details = 

sections.forEach((value) => 
  details.nickname = value
  list.push(...details)
);

console.log(list)

【讨论】:

【参考方案2】:

改用for...of,不要在foreach循环中使用async...await

【讨论】:

以上是关于推送到数组时,值被重复的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚如何将数据异步推送到数组

比较两个数组并将不同的值推送到新数组[重复]

在 Bash 的 heredoc 中将新值推送到数组

将对象推送到对象数组导致整个数组发生意外更改[重复]

删除排序数组中的重复项并将它们推送到新数组中

猫鼬:更新字段,将对象推送到数组中[重复]