Разница между obj.key=value и obj.set(ключ, значение)?

#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 потому что внутри пары квадратных скобок есть пары ключ-значение, да.