首页 > 解决方案 > 为什么我没有向存在对象添加新的键和值?

问题描述

我有一个迭代它的跟随对象,我可以添加一个新的键和值,但是当我必须进行数据库搜索并获取每个结果并添加为新的键 + 值不起作用时,Eslint 点 a Assignment to property of function parameter 'object'.eslintno-param-reassign,下面是不进行数据库搜索的示例。

const obj = {
  Cod: 43453,
  Informations: [
    {
      codPay: 802112,
      value: 80
    },
    {
      codPay: 802113,
      value: 80
    },
    {
      codPay: 802114,
      value: 80
    },
    {
      codPay: 802115,
      value: 80
    },
    {
      codPay: 802116,
      value: 80
    },
    {
      codPay: 802117,
      value: 80
    },
    {
      codPay: 802118,
      value: 80
    },
    {
      codPay: 802119,
      value: 80
    }
  ],
  status: 'OK'
}



obj["Informations"].forEach((f,index) => {
    f.more_info = index
})

console.log(obj)

通过进行数据库搜索:

obj["Informations"].forEach(asyn(f) => {
    const result = db.any("Select info From table where cod $1",f.codPay")
    f.more_info = result[0].info
})

通过打开这个db.any 值是正确的,但我不能添加新的密钥,我错过了哪里?

标签: javascript

解决方案


no-param-reassign规则用于警告您,改变参数可能会在代码的其他地方造成不良影响。例如,代码的某些其他部分可能依赖于假设每个Informations子对象仅包含codPayvalue属性,而没有其他内容(无more_info属性)。如果存在此类代码,则添加more_info属性可能会导致该代码停止工作。

一个不错的选择是使用.map, 创建全新的对象,而不是改变原来的对象。这将修复 linter 警告。

另一个问题是它看起来像db.any返回一个 Promise,在这种情况下你应该先等待它解决。要在循环中执行此操作,请使用Promise.all等待数组中的所有 Promise 解析。

const informationsWithMoreInfo = await Promise.all(
    obj.Informations.map(
        obj => db.any("Select info From table where cod $1", obj.codPay)
            .then(result => ({ ...obj, more_info: result[0].info }))
    )
);
// do stuff with informationsWithMoreInfo

await使其正常工作,请确保包含函数是async- 或者调用.thenPromise。


推荐阅读