我想把一个对象从一种格式转换成另一种格式。到目前为止,我的递归尝试失败了;要么我遇到了最大堆栈异常,要么我无法遍历所有路径。
让我们假设我们有一个列出问题及其答案的对象。可能有N个问题和M个答案。
开始时的对象:
var before = {
item: 'Question 1',
id: '1',
type: 'Question',
items: [
{
item: 'Answer 1',
id: '1.1',
type: 'Answer',
items:
[
{
item: 'Question 2',
id: '1.1.1',
type: 'Question',
items: [
{
item: 'Answer 2.1',
id: '1.1.1.1',
type: 'Answer'
},
{
item: 'Answer 2.2',
id: '1.1.1.2',
type: 'Answer'
}
]
}
// ...
]
}, {
item: 'Answer 1',
id: '1.2',
type: 'Answer',
items:
[
{
item: 'Question 3',
id: '1.2.1',
type: 'Question',
items: [
{
item: 'Answer 3.1',
id: '1.2.1.1',
type: 'Answer'
},
{
item: 'Answer 3.2',
id: '1.2.1.2',
type: 'Answer'
}
]
}
// ...
]
}
// ...
]
}
对象的外观(将所有“items”数组封装;将键名“item”更改为“title”,“id”更改为“key”,删除“type”,根据“type”添加“color”):
var after = {
items: [
{
title: 'Question 1',
key: '1',
color: 'Red',
items: [
{
title: 'Answer 1',
key: '1.1',
color: 'Blue',
items:
[
{
title: 'Question 2',
key: '1.1.1',
color: 'Red',
items: [
{
title: 'Answer 2.1',
key: '1.1.1.1',
color: 'Blue'
},
{
title: 'Answer 2.2',
key: '1.1.1.2',
color: 'Blue'
}
]
}
// ...
]
}, {
title: 'Answer 1',
key: '1.2',
color: 'Blue',
items:
[
{
title: 'Question 3',
key: '1.2.1',
color: 'Red',
items: [
{
title: 'Answer 3.1',
key: '1.2.1.1',
color: 'Blue'
},
{
title: 'Answer 3.2',
key: '1.2.1.2',
color: 'Blue'
}
]
}
// ...
]
}
// ...
]
}
]
}
这似乎很容易,但我不能使它工作。我就是这样尝试迭代的:
function iter(o) {
for(let k in o) {
if (!(['item', 'items', 'id'].includes(k))) // My object contains a few more keys I don't want to go down further into
continue
if (o[k] !== null && typeof o[k] === 'object') {
iter(o[k]); // Max stack exception
return;
}
}
};
非常感谢!
您可以使用map实现这一点,我编写了一个简单的测试来说明我的观点
这是代码的重要部分
function rename(item: any) {
return {
title: item.item,
key: item.id,
color: item.type === 'Question' ? 'red' : 'blue',
items: item.items?.map(rename)
}
}
console.log(items.map(rename))
当然,如果您使用的是typescript,请将any
更改为适当的类型,并注意我使用的是?
运算符,该运算符不适用于javascript,因此您可以执行以下操作
...
items: item.items ? item.items.map(rename) : undefined
...
您可以映射对象,重命名键和映射嵌套项。
null
const
iter = ({ item: title, id: key, type, items, ...o }) => ({
title,
key,
color: 'color' + key,
...o,
...(items && { items: items.map(iter) })
}),
before = { item: 'Question 1', id: '1', type: 'Question', items: [{ item: 'Answer 1', id: '1.1', type: 'Answer', items: [{ item: 'Question 2', id: '1.1.1', type: 'Question', items: [{ item: 'Answer 2.1', id: '1.1.1.1', type: 'Answer' }, { item: 'Answer 2.2', id: '1.1.1.2', type: 'Answer' }] }] }, { item: 'Answer 1', id: '1.2', type: 'Answer', items: [{ item: 'Question 3', id: '1.2.1', type: 'Question', items: [{ item: 'Answer 3.1', id: '1.2.1.1', type: 'Answer' }, { item: 'Answer 3.2', id: '1.2.1.2', type: 'Answer' }] }] }] },
result = [before].map(iter);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。
问题内容: 我有一个JSON数据结构,如下所示: 我需要将键名称从“名称”和“子代”更改为“键”和“值”。关于如何为该嵌套结构中的每个键名执行此操作的任何建议? 问题答案: 我不知道为什么JSON标记的末尾会有分号 (假设这就是问题中所代表的意思) ,但是如果删除了分号,则可以在分析数据时使用 reviver函数 进行修改。 演示: http : //jsfiddle.net/BeSad/
我知道我不是第一个问这个的,但是我在前面的问题中找不到答案。我有一个组件 在控制器中,会不时发生变化。 在中,数据以表格格式作为HTML输出。每当发生更改时,此值就会发生更改。 我的组件需要使用作为触发器在Google Map上重绘标记。问题是,当在父级中更改时,ngOnChanges不会激发。我能做什么? 更新:ngOnChanges不工作,但看起来像是正在更新lapsData。在ngInit中
我面临的问题是我需要一个身份验证令牌来创建我的Retrofit服务。我目前使用可观察来获取所述令牌,导致一个相当丑陋的可观察构造: 我忍不住觉得这不是应该做的。我说得对吗?
问题内容: 我使用此代码从Jhonny的Question中的json 对象中找到了所需的部分 数据样本 查找功能 像这样使用: 此代码是从源代码中选择匹配的片段。但是我想要的是用新值更新源对象并检索更新的源对象。 我想要类似的东西 我的密码 如果我给定但如果我将代码更改为未定义的更新,则此方法有效。 为什么呢? 问题答案: 您忘记在嵌套调用中传递newValue
问题内容: 我有两个结构: 它代表我的自定义PostgreSQL对象类型(我自己创建): 下一个结构是DB中的表: 我的自定义对象嵌套在Client类型中,名为。我尝试通过以下方式读取数据: 但不幸的是,我无法读取字段(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正
我有一个带有嵌套字段的JSON: 我正在使用JSONPATH从嵌套中获取。 我已经将我的JSON文本粘贴到了http://jsonpath.com/这个网站上;并且在使用了这一行之后: 我得到了这个: 使用此行后: 我得到了这个: 我尝试返回(输出)的内容如下: 但是我找不到合适的语法来将这两个组合在一行中,并用一个JSONPATH查询返回它们。
问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个: