【问题标题】: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 的声明更新您的问题

标签: javascript node.js json discord discord.js


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多