Map.get() 在节点 js javascript 中从 mongodb 获取数据时总是 return 未定义
Map.get() in node js javascript always return undefined while fetching data from mongodb
我在这里使用存储了 id:quantity 对的地图 我想将这个数量添加到产品数组(包含对象)的每个项目中,我通过 map.get( id) 方法,尽管 id 的类型和传递给 get 函数的 id 具有相同的值和数据类型,但我变得不确定,我试图验证 map 和传递的 id 中 id 的类型和值,两者都是相同的。仍然问题存在
这是错误的代码,实际上我是通过这个函数返回一个承诺
var cartMap = new Map();
for (let i = 0; i < this.cart.items.length; i++) {
const e = this.cart.items[i];
cartMap.set(mongodb.ObjectId(e._id), e.quantity);
}
db.collection("products").find({ _id: { $in: [...productIds] } }).toArray().then((products) => {
console.log(cartMap);
let newProd = products.map(prod => {
console.log(cartMap.get(prod._id)); // returns undefined
prod.quantity = cartMap.get(prod._id);
// cartMap.set(prod._id, -1);
return prod;
})
console.log(newProd);
if (productIds.length > products.length) {
let garbageCart = cartMap.keys().filter(prod => {
if (cartMap.get(prod) != -1) {
return prod;
}
})
garbageCart.sort();
this.cart.items.sort();
let i = 0;
let updatedCart = this.cart.items.filter(prod => {
if (i >= garbageCart.length) {
}
else if (prod._id == garbageCart[i]) {
i++;
}
else {
return prod;
}
})
db.collection("users").updateOne({ _id: this.id }, {
$set: { cart: updatedCart }
})
}
resolve(newProd);
控制台消息
Map(2) { 608c49bca4d1ed0bfc8c41fb => 1, 608c4a41a4d1ed0bfc8c41ff => 1 }
undefined
undefined
[
{
_id: 608c49bca4d1ed0bfc8c41fb,
title: 'chhole bhature',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui dolor ratione officia quam magni sed, consequuntur maiores illo labore quas molestiae suscipit asperiores beatae voluptatem saepe commodi explicabo perspiciatis non sequi in praesentium illum, nesciunt iste.',
price: '1000',
imageurl: 'imageurl',
userId: null,
quantity: undefined
},
{
_id: 608c4a41a4d1ed0bfc8c41ff,
title: 'hat',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui dolor ratione officia quam magni sed, consequuntur maiores illo labore quas molestiae suscipit asperiores beatae voluptatem saepe commodi explicabo perspiciatis non sequi in praesentium illum, nesciunt iste.',
price: '478',
imageurl: 'imageurl',
userId: null,
quantity: undefined
}
]
这是因为一方面 mongodb.ObjectId(e._id)
和另一方面 prod._id
是对内存中两个不同位置的引用,因此它们不会相互比较 -尽管我知道这些位置可用的对象代表相同的 ObjectId
.
为了在 map()
用法的上下文中进一步说明这一点:
var map = new Map()
// object1 and object2 represent the same object, but point to different locations in memory
var object1 = createObject()
var object2 = createObject()
map.set(object1, "some value")
console.log(map.get(object1)) // output: "some value"
console.log(map.get(object2)) // output: undefined
function createObject() {
return {
key: "value"
}
}
您可以改为使用这些对象字符串表示作为地图的键 - 通过使用它们的 ObjectId.toString()
方法转换它们。由于它们是值 - 与引用相反 - 类型,表示相同字符序列的字符串将相互比较。
我在这里使用存储了 id:quantity 对的地图 我想将这个数量添加到产品数组(包含对象)的每个项目中,我通过 map.get( id) 方法,尽管 id 的类型和传递给 get 函数的 id 具有相同的值和数据类型,但我变得不确定,我试图验证 map 和传递的 id 中 id 的类型和值,两者都是相同的。仍然问题存在
这是错误的代码,实际上我是通过这个函数返回一个承诺
var cartMap = new Map();
for (let i = 0; i < this.cart.items.length; i++) {
const e = this.cart.items[i];
cartMap.set(mongodb.ObjectId(e._id), e.quantity);
}
db.collection("products").find({ _id: { $in: [...productIds] } }).toArray().then((products) => {
console.log(cartMap);
let newProd = products.map(prod => {
console.log(cartMap.get(prod._id)); // returns undefined
prod.quantity = cartMap.get(prod._id);
// cartMap.set(prod._id, -1);
return prod;
})
console.log(newProd);
if (productIds.length > products.length) {
let garbageCart = cartMap.keys().filter(prod => {
if (cartMap.get(prod) != -1) {
return prod;
}
})
garbageCart.sort();
this.cart.items.sort();
let i = 0;
let updatedCart = this.cart.items.filter(prod => {
if (i >= garbageCart.length) {
}
else if (prod._id == garbageCart[i]) {
i++;
}
else {
return prod;
}
})
db.collection("users").updateOne({ _id: this.id }, {
$set: { cart: updatedCart }
})
}
resolve(newProd);
控制台消息
Map(2) { 608c49bca4d1ed0bfc8c41fb => 1, 608c4a41a4d1ed0bfc8c41ff => 1 }
undefined
undefined
[
{
_id: 608c49bca4d1ed0bfc8c41fb,
title: 'chhole bhature',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui dolor ratione officia quam magni sed, consequuntur maiores illo labore quas molestiae suscipit asperiores beatae voluptatem saepe commodi explicabo perspiciatis non sequi in praesentium illum, nesciunt iste.',
price: '1000',
imageurl: 'imageurl',
userId: null,
quantity: undefined
},
{
_id: 608c4a41a4d1ed0bfc8c41ff,
title: 'hat',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui dolor ratione officia quam magni sed, consequuntur maiores illo labore quas molestiae suscipit asperiores beatae voluptatem saepe commodi explicabo perspiciatis non sequi in praesentium illum, nesciunt iste.',
price: '478',
imageurl: 'imageurl',
userId: null,
quantity: undefined
}
]
这是因为一方面 mongodb.ObjectId(e._id)
和另一方面 prod._id
是对内存中两个不同位置的引用,因此它们不会相互比较 -尽管我知道这些位置可用的对象代表相同的 ObjectId
.
为了在 map()
用法的上下文中进一步说明这一点:
var map = new Map()
// object1 and object2 represent the same object, but point to different locations in memory
var object1 = createObject()
var object2 = createObject()
map.set(object1, "some value")
console.log(map.get(object1)) // output: "some value"
console.log(map.get(object2)) // output: undefined
function createObject() {
return {
key: "value"
}
}
您可以改为使用这些对象字符串表示作为地图的键 - 通过使用它们的 ObjectId.toString()
方法转换它们。由于它们是值 - 与引用相反 - 类型,表示相同字符序列的字符串将相互比较。