【问题标题】:Extract data from Nested Array Object从嵌套数组对象中提取数据
【发布时间】:2021-03-22 06:46:36
【问题描述】:

以下是从 Datatables 的 Search Builder Plugin 生成的 JSON,我想使用 javascript 以以下格式显示输出,而不使用任何库。

(Registration=1)OR((Registration=2)OR(Number=3))OR(Number=4)OR(Station=Yes)
var sbfilter = {
  "criteria": [
    {
      "condition": "=",
      "data": "Registration",
      "value": [
        "1"
      ]
    },
    {
      "criteria": [
        {
          "condition": "=",
          "data": "Registration",
          "value": [
            "2"
          ]
        },
        {
          "condition": "=",
          "data": "Number",
          "value": [
            "3"
          ]
        }
      ],
      "logic": "OR"
    },
    {
      "condition": "=",
      "data": "Number",
      "value": [
        "4"
      ]
    },
    {
      "condition": "=",
      "data": "Station",
      "value": [
        "Yes"
      ]
    }
  ],
  "logic": "OR"
};

【问题讨论】:

  • 你的格式能比(Registration=1)OR((Registration=2)OR(Number=3))OR(Number=4)OR(Station=Yes) 更好吗?也许是输出的一个例子。
  • 嗨 Rifat,因为这是一个过滤条件生成的 JSON,我更喜欢以这种方式显示逻辑运算符。

标签: javascript arrays json object


【解决方案1】:

这就是我现在能想到的,使用循环和递归遍历每个嵌套数组并生成查询字符串。算法有待改进。

var sbfilter = {
  "criteria": [
    {
      "condition": "=",
      "data": "Registration",
      "value": [
        "1"
      ]
    },
    {
      "criteria": [
        {
          "condition": "=",
          "data": "Registration",
          "value": [
            "2"
          ]
        },
        {
          "condition": "=",
          "data": "Number",
          "value": [
            "3"
          ]
        }
      ],
      "logic": "OR"
    },
    {
      "condition": "=",
      "data": "Number",
      "value": [
        "4"
      ]
    },
    {
      "condition": "=",
      "data": "Station",
      "value": [
        "Yes"
      ]
    }
  ],
  "logic": "OR"
};
var query = '';
function makeQuery(criteria, logic) {
  criteria.forEach((c, idx, array)=>{
    if (c.criteria) {
      // Add a parentheses since it's the start of a sub query
      query+='('
      makeQuery(c.criteria, c.logic)
      // Close the parentheses
      query+=')'
    } else {
      query+= '('+c.data+c.condition+c.value[0]+')'
    }
    // Check if not the last condition then add the logic to it
    if (idx != array.length - 1) {
      query+=logic
    }
  })
}
makeQuery(sbfilter.criteria, sbfilter.logic)
console.log(query)

【讨论】:

  • 工作完美!绝妙的解决方案!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多