Javascript对象不附加新属性

Posted

技术标签:

【中文标题】Javascript对象不附加新属性【英文标题】:Javascript object not appending new attribute 【发布时间】:2019-06-21 15:14:00 【问题描述】:

我有这个函数,我在其中检索一个对象数组,然后我有一个 for 循环来循环遍历对象,并向它附加一个索引或 ind 属性:

module.exports.getCustomers = async (req, res) => 
  let customers = await Customers.find(,  "_id": 1 );

  for (var i = 0; i < customers.length; i++) 
    customers[i].ind = i;
  

  console.log(customers)

但是当我运行它时,数据返回为

[
   _id: ... ,
   _id: ... ,
  ...
]

代替:

[
   _id: ..., ind: 0,
   _id: ..., ind: 1,
   ...
]

请问我该如何解决这个问题

【问题讨论】:

你试过Object.assign吗? 所提供的代码没有问题,您可以给我们提供有关 Customers.find() 的更多信息 试试这个:await Customers.find(, "_id": 1 ).toArray(); 能否提供await Customers.find(, "_id": 1 )的值?这样更容易提供解决方案。 Customers.find()returns a cursor,你会find here如何正确使用它 【参考方案1】:

更改您的 for 并将其变成 map

module.exports.getCustomers = async (req, res) => 
  let customers = await Customers.find(,  "_id": 1 );

  let mappedCustomers = customers.map((customer, index) => 
              customer['ind'] = index;
              return customer;
          );


  console.log(mappedCustomers);
  return mappedCustomers;

您也可以创建一个全新的客户。

let mappedCustomers = customers.map((customer, index) => 
              return ...customer, ind: index;
              );

【讨论】:

【参考方案2】:

您的对象似乎被冻结了,不知道您使用什么库从数据源中获取这些项目,但您可以在此处阅读有关对象冻结的信息 https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Object/freeze

【讨论】:

问题被标记为mongodb【参考方案3】:

尝试使用Object.assign 将值复制到各个目标对象。

module.exports.getCustomers = async(req, res) => 
  let customers = await Customers.find(, 
    "_id": 1
  );

  for (var i = 0; i < customers.length; i++) 
    Object.assign(customers[i], 
      ind: i
    );
  

  console.log(customers);

【讨论】:

【参考方案4】:

我终于解决了。我认为mongoose 搞砸了。但是添加._doc 似乎已经修复了它

for (let i = 0; i < customers.length; i++) 

    let customer = customers[i], 

    customer._doc = 
      ...customer._doc,
      index: i
    ;

【讨论】:

以上是关于Javascript对象不附加新属性的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript将属性附加到对象[重复]

将序列号属性附加到javascript中的对象数组

JavaScript:字段或属性

JS_3浏览器对象

JavaScript对象

我们可以在 JavaScript 中为不可变对象添加属性吗?