作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 this query component在我的一个项目中,以便用户可以构建查询。
我很难将其解析为实际的示例查询,例如组件输出的这个对象:
const queryParams = {
"rules": [
{
"rules": [
{
"field": "firstName",
"value": "John",
"operator": "="
},
{
"field": "lastName",
"value": "Doe",
"operator": "="
}
],
"combinator": "and"
},
{
"rules": [
{
"field": "age",
"value": "20",
"operator": "="
},
{
"field": "address",
"value": "London",
"operator": "="
}
],
"combinator": "and"
}
],
"combinator": "and"
}
我需要创建一个函数来输出对用户更友好的可读输出:
((FirstName = John AND LastName = Doe) AND (AGE = 20 AND Address = London))
我试过了,但我发现的困难在于:
这个对象理论上可以无限嵌套,我永远不知道它是如何嵌套的。是用递归做到这一点的唯一方法吗?或者有没有更简单的方法
规则和组可以在同一个对象中
我目前正在尝试的方式不会动态工作,因此非常感谢任何帮助或指导。
谢谢
最佳答案
您可以采用递归方法构建规则集或最终比较。
它通过检查 rules
属性来工作:
如果给定,则规则
映射到函数的递归调用。
此调用的结果与大写的 combinator
属性相结合,并用括号包裹到所需的间隔字符串中。
如果不是,则取一个带有field
、operator
和value
属性的新字符串。
function combine(object) {
return 'rules' in object
? `(${object.rules.map(combine).join(` ${object.combinator.toUpperCase()} `)})`
: `${object.field} ${object.operator} ${object.value}`;
}
var data = { rules: [{ rules: [{ field: "firstName", value: "John", operator: "=" }, { field: "lastName", value: "Doe", operator: "=" }], combinator: "and" }, { rules: [{ field: "age", value: "20", operator: "=" }, { field: "address", value: "London", operator: "=" }], combinator: "and" }], combinator: "and" },
result = combine(data);
console.log(result);
关于javascript - 遍历无限嵌套对象并构造字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54590757/
我是一名优秀的程序员,十分优秀!