javascript - 使用 JSON 中的动态多维键值对

标签 javascript jquery json multidimensional-array key-pair

遇到棘手的问题,只能在 SO 上看到类似但也更简单的解决方案。

是否可以使用 JS/JSON 生成动态键和动态值?

例如,假设我有这样的 JSON:

{
    "email": "user@someco.com",
    "firstname": "Bob",
    "lastname": "Smith",
    "company": "ACME",
    "custom": {
        "services": [
            {
                "name": "svc1",
                "desc": "abcdefg",
                "selected": "true",
                "status": "None"
            },
            {
                "name": "svc2",
                "desc": "abcdefg",
                "selected": "true",
                "status": "None"
            },
            {
                "name": "svc3",
                "desc": "abcdefg",
                "selected": "false",
                "status": "None"
            },
            {
                "name": "svc4",
                "desc": "abcdefg",
                "selected": "false",
                "status": "None"
            }
        ],
        "fields": [
            {
                "name": "Products",
                "desc": "abcdef",
                "type": "multi",
                "values": [
                    {
                        "name": "Product1",
                        "desc": "abcdef"
                    },
                    {
                        "name": "Product2",
                        "desc": "abcdef"
                    }
                ],
                "services": [
                    "svc1",
                    "svc2",
                    "svc3"
                ]
            },
            {
                "name": "Wines",
                "desc": "abcdef",
                "type": "multi",
                "values": [
                    {
                        "name": "Wine 1",
                        "desc": "abcdef"
                    }
                ],
                "services": [
                    "svc4"
                ]
            },
            {
                "name": "Fruits",
                "desc": "abcdef",
                "type": "multi",
                "values": [
                    {
                        "name": "Fruit 1",
                        "desc": "abcdef"
                    },
                    {
                        "name": "Fruit 2",
                        "desc": "abcdef"
                    }
                ],
                "services": [
                    "svc4"
                ]
            }
        ]
    }
};

我需要进入各个字段,对于每个字段(产品、 Wine 、水果),查看其中是否包含给定的服务,以便我可以返回并为每个需要它的服务生成产品或 Wine 或水果。但我不想多次重复服务名称。生成的 JSON 应如下所示:

{"svc1":["Products"], "svc2":["Products"], "svc3":["Products"], "svc4":["Fruits", "Wines"]} 

希望在 Angular 中生成一个动态列表,我可以通过这个 JSON 进行循环,提取每种产品、水果、 Wine 等的值。

我一直在尝试很多嵌套的 for 循环等,但每当我向下超过一层时,活力似乎就会停止。我猜想为了这个工作我需要在 JS 对象和 JSON 之间移动?

现在我正在尝试这样的事情,无论是否字符串化,它都不太有效。也许我在 JSON 和 JS 对象之间摇摆太多:

var outObj = [];    

var fieldItems;
        $.each(jsonObj.custom.fields, function(key, item) {
            fieldItems = item;
            fieldItems.name = item.name;
            $.each(fieldItems.services, function(key, item) {
                var serviceName = item;
//check to see if the serviceName already exists
                if (outObj.indexOf(serviceName) > -1) {
                outObj.serviceName.push(fieldItems.name);
            } else {
                outObj.push(serviceName);
            }

            });
        });

        JSON.stringify(outObj);
        console.log("outObj " + outObj);

我收到“无法读取未定义的属性‘push’”错误等。似乎这应该可以从单个嵌套循环中实现,但也许我只需要执行两次传递?还有其他建议吗?

最佳答案

对我来说,这听起来像是过于复杂的解决方案。您可以使用 javascript 的基本数组方法来过滤出所需的结构。我不确定所提供的代码片段中的 profiling_value 是什么,所以我从 OP 中的对象结构开始

var desiredResult = jsonObj.custom.services.reduce(function(result, service){
  result[service.name] = jsonObj.custom.fields.filter(function(field){
       return field.services.indexOf(service.name) >= 0;
   }).map(function(field){ return field.name; });
  return result;
}, {});

这给出了所提到的对象的预期结果。

需要

reduce 来迭代所有服务并将结果累积到一个对象中。然后,对每个服务字段进行迭代,以过滤仅包含包含该服务链接的字段。最后,过滤字段列表被转换(map)为字符串列表 - 它们的名称 - 并插入到累加器中

关于javascript - 使用 JSON 中的动态多维键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31975753/

相关文章:

javascript - 扑克牌生成器和评估器

javascript - 要使其正常工作,对最后 3 行代码的最小更改是什么?

javascript - 是否可以进一步压缩 Base64 PNG 字符串?

javascript - jquery 规模失去位置

jQuery,真实 :not operator equivalent?

jquery - 如何使用 jquery 在 keydown 上隐藏 iframe

android - 反序列化 json 对象失败

javascript - 如何使用 Lo-Dash 连接数组

python - 从 json 中删除重复项

python - Flask 中的 JSON 数据是字符串还是字典?