【问题标题】:Best way to parse the Json in javascript and get the key / value在javascript中解析Json并获取键/值的最佳方法
【发布时间】:2017-03-21 19:32:08
【问题描述】:

我正在尝试解析以下 JSON(格式),将其展平并获取所需的键/值(输出),如下所述。我正在尝试找出最好的方法。

我需要获取 displayName 及其对应的父级

例如: 特征:分类特征

输入:

 {
          "Shop": {
            "subFilter": [
              {
                "taxoFeatures": {
                  "displayName": "Features"
                }
              },
              {
                "color_base": {
                  "displayName": "Colour"
                }
              }
            ],
            "displayName": "Shopping"
          },
          "Support": {
            "subFilter": [
              {
                "contentType": {
                  "displayName": "Content"
                }
              }
            ],
            "displayName": "Support documents"
          }
        }

预期输出:

    {
        "Shopping": "Shop",
        "Features":"taxoFeatures",
        "Colour":"color_base",
        "Content":"contentType",
        "Support documents":"Support"
        }

我正在考虑遍历 JSON 并找到键并添加相应的键和 displayName 值(然后遍历每个子数组并存储这些值)。还有其他想法吗?

     let customName = {};
    for (const key in filter) {
            if (filter.hasOwnProperty(key)) {
                const value = filter[key];
                 if (isNotEmpty(value.displayName)) {
                    customName[value.displayName] = key;
                }
            }
        }

【问题讨论】:

  • 这里真正重要的是了解您正在寻找的模式,然后您可以创建一个有效的算法。我不容易看出您正在收集的数据的模式是什么。如果它在每种情况下都是特定且独特的,那么很难编写一个包罗万象的函数来提取您需要的任何数据。

标签: javascript arrays json node.js


【解决方案1】:

您可以使用这个递归函数,它使用reduceObject.assign 构建结果对象:

function transform(filter) {
    return Object.keys(filter).reduce( (acc, key) => {
        const value = filter[key];
        if (Object(value) === value) { // it's an object
            if ('displayName' in value) {
                acc[value.displayName] = key;
            }
            Object.assign(acc, transform(value)); // recurse
        }
        return acc;
    }, {});
}

// Sample input
const filter = {
  "Shop": {
    "subFilter": [
      {
        "taxoFeatures": {
          "displayName": "Features"
        }
      },
      {
        "color_base": {
          "displayName": "Colour"
        }
      }
    ],
    "displayName": "Shopping"
  },
  "Support": {
    "subFilter": [
      {
        "contentType": {
          "displayName": "Content"
        }
      }
    ],
    "displayName": "Support documents"
  }
}

console.log(transform(filter));

【讨论】:

    【解决方案2】:

    嗯,基本上是的。您需要循环遍历它,但是由于您具有相同的代码,您可以进行递归,如下所示:

    function doit (json) {
        let ret = {};
        Object.keys(json).forEach((key) => {
            const childs = (!!json[key].subFilter) ? json[key].subFilter.map(doit) : [];
            ret          = Object.assign(ret, { [json[key].displayName]: key }, ...childs);
        });
        return ret;
    }
    

    【讨论】:

      【解决方案3】:

      这是另一种方法:

      var data  = {
                "Shop": {
                  "subFilter": [
                    {
                      "taxoFeatures": {
                        "displayName": "Features"
                      }
                    },
                    {
                      "color_base": {
                        "displayName": "Colour"
                      }
                    }
                  ],
                  "displayName": "Shopping"
                },
                "Support": {
                  "subFilter": [
                    {
                      "contentType": {
                        "displayName": "Content"
                      }
                    }
                  ],
                  "displayName": "Support documents"
                }
              };
                          
      var res = {};
      function search(obj){
          for(item in obj) {
          	res[obj[item].displayName] = item;
              if (obj[item].subFilter) 
                  obj[item].subFilter.forEach((subitem)=>search(subitem));
          }
      }
      
      search(data);
      console.log(res);

      JSFiddle:https://jsfiddle.net/7b6bcjfk/

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2013-05-29
        • 2017-06-30
        相关资源
        最近更新 更多