首页 > 解决方案 > 使用 ES 6 方法转换 JSON 数组

问题描述

我有以下需要转换的数组格式示例。

{ [
  {
    "condition": "$and",
    "children": [
      { "column": "Title", "comparison": "$eq", "columnValue": "1" },
      { "column": "Event Status", "comparison": "$eq", "columnValue": "2" }
    ]
  },
  {
    "condition": "$or",
    "children": [
      {
        "column": "Issue Description",
        "comparison": "$lt",
        "columnValue": "3"
      },
      { "column": "Number Label", "comparison": "$gte", "columnValue": "4" }
    ]
  }
]}

需要这样改造……

{ 
    [
        { 
            "$and" : [
                { 
                    "Title" : {
                        "$eq" : "1"
                    }
                }, 
                { 
                    "Event Status" : {
                        "$eq" : "2"
                    }
                }
            ]
        }, 
        { 
            "$or" : [
                { 
                    "Issue Description" : { 
                        "$lt" : "3"
                    }
                }, 
                { 
                    "Number Label" : { 
                        "$gte" : "4"
                    }
                }
            ]
        }
    ]
}

我已经尝试了 map 和 reduce 的各种迭代。接近了,但不完全在那里。

这是在一个 Vue 项目中。这是我尝试过的一个例子。

const result = this.parents.map(({ condition, children }) => {
        const childArray = children.reduce(
          (c, v) => ({
            ...c,
            [v.column]: { [v.comparison]: v.columnValue }
          }),
          {}
        );
        childArray.condition = condition;
        return childArray;
      });

这将返回:

[
  {
    "Title": { "$eq": "1" },
    "Event Status": { "$eq": "2" },
    "condition": "$and"
  },
  {
    "Issue Description": { "$lt": "3" },
    "Number Label": { "$gte": "4" },
    "condition": "$or"
  }
]

我无法弄清楚如何在正确的位置获得“条件”键。

标签: javascriptjsonmongodb

解决方案


ES6 计算属性名称将有很大帮助,允许用[]方括号括起来的变量表达式来计算键值......

let inputExpressions = [
  {
    "condition": "$and",
    "children": [
      { "column": "Title", "comparison": "$eq", "columnValue": "1" },
      { "column": "Event Status", "comparison": "$eq", "columnValue": "2" }
    ]
  },
  {
    "condition": "$or",
    "children": [
      {
        "column": "Issue Description",
        "comparison": "$lt",
        "columnValue": "3"
      },
      { "column": "Number Label", "comparison": "$gte", "columnValue": "4" }
    ]
  }
];

function translateExpression(expression) {
  const translateClause = clause => {
    return { [clause.column] :  { [clause.comparison] : clause.columnValue } };
  };
  return { [expression.condition] : expression.children.map(translateClause) };
}

let resultExpressions = inputExpressions.map(translateExpression);
console.log(resultExpressions)


推荐阅读