元字段值是一个已保存为字符串的对象 我通过 mongoose 从 mongo 获取数据
const goodsIssued = await goods
.find({ category: username, tokenName })
.sort([['createdAt', -1]])
.limit(2)
.exec();
数据看起来像..
{
"goodsIssued": [
{
"minted": false,
"_id": "5e3163597fd0ad2113bcdefe",
"category": "gameco11",
"goodId": 64,
"issuedTo": "player2",
"memo": "this is a test token",
"meta": "{\"data\": \"text\", \"test\":1, \"works\": true}",
"tokenName": "token5",
"createdAt": "2020-01-29T10:50:01.257Z",
"updatedAt": "2020-01-29T10:50:01.257Z",
"__v": 0
},
{
"minted": false,
"_id": "5e3163587fd0ad2113bcdefd",
"category": "gameco11",
"goodId": 63,
"issuedTo": "player2",
"memo": "this is a test token",
"meta": "{\"data\": \"text\", \"test\":1, \"works\": true}",
"tokenName": "token5",
"createdAt": "2020-01-29T10:50:00.691Z",
"updatedAt": "2020-01-29T10:50:00.691Z",
"__v": 0
}
]
}
我想在将对象数组返回到前端之前将其转换为对象
for (const key in goodsIssued) {
if (goodsIssued.hasOwnProperty(key)) {
const parsedMeta = JSON.parse(goodsIssued[key].meta);
goodsIssued[key].meta = parsedMeta;
}
}
但它没有改变?为什么?
最佳答案
我看到两种可能性,其中任何一个都可能是问题所在,甚至可能是两者的组合。
您更新的问题显示
goodsIssued
变量被分配了一个具有goodsIssued
属性的对象,该属性是一个数组,而您原来的问题仅显示了该数组。您的代码正在循环访问该顶级对象,而不是数组。我怀疑您从卡住了它提供给您的完整对象树的东西中获取该对象。在这种情况下,分配给
meta
将不起作用,因为它所在的对象已被卡住。
如果我是对的,为了更新这些属性,您必须复制所有内容,也许像这样:
// 1. Get the array, not the object containing it
let goodsIssued = (await /*...get the goods*/).goodsIssued;
// 2. Create a new, unfrozen array with objects with unfrozen properties,
// and parse `meta` along the way
goodsIssued = [...goodsIssued.map(entry => ({...entry, meta: JSON.parse(entry.meta)}))];
实例:
async function getTheGoods() {
return Object.freeze({
"goodsIssued": Object.freeze([
Object.freeze({
"minted": false,
"_id": "5e3163597fd0ad2113bcdefe",
"category": "gameco11",
"goodId": 64,
"issuedTo": "player2",
"memo": "this is a test token",
"meta": "{\"data\": \"text\", \"test\":1, \"works\": true}",
"tokenName": "token5",
"createdAt": "2020-01-29T10:50:01.257Z",
"updatedAt": "2020-01-29T10:50:01.257Z",
"__v": 0
}),
Object.freeze({
"minted": false,
"_id": "5e3163587fd0ad2113bcdefd",
"category": "gameco11",
"goodId": 63,
"issuedTo": "player2",
"memo": "this is a test token",
"meta": "{\"data\": \"text\", \"test\":1, \"works\": true}",
"tokenName": "token5",
"createdAt": "2020-01-29T10:50:00.691Z",
"updatedAt": "2020-01-29T10:50:00.691Z",
"__v": 0
})
])
});
}
// (Your code is apparently in an `async` function)
(async () => {
// 1. Get the array, not the object containing it
let goodsIssued = (await getTheGoods()).goodsIssued;
// 2. Create a new, unfrozen array with objects with unfrozen properties,
// and parse `meta` along the way
goodsIssued = [...goodsIssued.map(entry => ({...entry, meta: JSON.parse(entry.meta)}))];
// Done!
console.log(goodsIssued);
})()
.catch(error => {
console.error(error);
});
.as-console-wrapper {
max-height: 100% !important;
}
或者,如果您确实想要包装对象:
// 1. Get the object
let obj = await /*...get the goods...*/;
// 2. Create a new, unfrozen object with an unfrozen array with objects with unfrozen properties,
// and parse `meta` along the way
obj = {...obj, goodsIssued: [...obj.goodsIssued.map(entry => ({...entry, meta: JSON.parse(entry.meta)}))]};
实例:
async function getTheGoods() {
return Object.freeze({
"goodsIssued": Object.freeze([
Object.freeze({
"minted": false,
"_id": "5e3163597fd0ad2113bcdefe",
"category": "gameco11",
"goodId": 64,
"issuedTo": "player2",
"memo": "this is a test token",
"meta": "{\"data\": \"text\", \"test\":1, \"works\": true}",
"tokenName": "token5",
"createdAt": "2020-01-29T10:50:01.257Z",
"updatedAt": "2020-01-29T10:50:01.257Z",
"__v": 0
}),
Object.freeze({
"minted": false,
"_id": "5e3163587fd0ad2113bcdefd",
"category": "gameco11",
"goodId": 63,
"issuedTo": "player2",
"memo": "this is a test token",
"meta": "{\"data\": \"text\", \"test\":1, \"works\": true}",
"tokenName": "token5",
"createdAt": "2020-01-29T10:50:00.691Z",
"updatedAt": "2020-01-29T10:50:00.691Z",
"__v": 0
})
])
});
}
// (Your code is apparently in an `async` function)
(async () => {
// 1. Get the object
let obj = await getTheGoods();
// 2. Create a new, unfrozen object with an unfrozen array with objects with unfrozen properties,
// and parse `meta` along the way
obj = {...obj, goodsIssued: [...obj.goodsIssued.map(entry => ({...entry, meta: JSON.parse(entry.meta)}))]};
// Done!
console.log(obj);
})()
.catch(error => {
console.error(error);
});
.as-console-wrapper {
max-height: 100% !important;
}
不过,您可能不需要 #1 或 #2(或者您可能确实需要两者),具体取决于实际问题是什么。
关于javascript - TypeScript:将字符串转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59965355/