#javascript #arrays #json #object #ecmascript-6
#javascript #массивы #json #объект #ecmascript-6
Вопрос:
Итак, пытаясь обновить документ в mongoose, я понял, что когда я делаю obj.key=value
с документом, который я получил Model.findOne()
, он не присваивает свойство его значению. Но после попытки obj.set(ключ, значение) свойству присваивается его значение в документе. Так почему же это? Обычно, когда я выполняю первый метод для объекта, объект получает свойство. Что это за .set()
функция? Имеет ли это какое-то отношение к mongoose?
//this works
async function updateItem(){
let updatedItem = await Item.findOne({name:req.body.itemName});
Object.entries(req.body).forEach(elem=>{
if(elem[0]!=="itemName"){
updatedItem.set(elem[0], elem[1]);
};
});
};
updateItem();
});
//this doesn't work
async function updateItem(){
let updatedItem = await Item.findOne({name:req.body.itemName});
Object.entries(req.body).forEach(elem=>{
if(elem[0]!=="itemName"){
updatedItem.elem[0] = elem[1];
};
});
};
updateItem();
});
Комментарии:
1. Я не уверен, связано ли это с реактивным программированием или нет, но вот объяснение того, как это работает в Vuejs vuejs.org/v2/guide/reactivity.html
2. Теперь я понимаю. Это из-за геттеров и сеттеров. Спасибо.
Ответ №1:
Это означает, что updatedItem
это не объект, это a Map
, и для добавления элементов в a Map
вам нужно использовать get
метод.
Еще одна вещь, на которую следует обратить внимание, это то, что когда вы устанавливаете updatedItem.elem[0]
, вы буквально пытаетесь добавить ключ "elem[0]"
updatedItem
. Чтобы исправить это, вам необходимо использовать динамическое обозначение свойств с квадратными скобками:
updatedItem[elem[0]] = elem[1];
Это создает новый ключ со значением elem[0]
, а не с ключом elem[0]
.
Комментарии:
1. Спасибо за большую помощь. Теперь у меня есть представление о том, что искать, хотя я чего-то не понял из документации.
2. На самом деле, то, что я собираюсь спросить, не имеет к этому никакого отношения, но это беспокоило меня при попытке обновить элемент. Перед вводом
Item.findOne()
это былоItem.find()
, поэтому он вернул массив. И я ввелupdatedItem[elem[0]] = elem[1]
, и он возвращает что-то вроде этого[{key:value, key:value, key: value}, key:value, key:value]
, но не сохраняется в базе данных. Является ли этот массив также картой?3. @EyePatch потому что внутри пары квадратных скобок есть пары ключ-значение, да.