簡體   English   中英

在JSON中使用動態多維鍵/值對

[英]Working With Dynamic Multidimensional key-value pairs in JSON

遇到一個棘手的問題,只能在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"
                ]
            }
        ]
    }
};

我需要進入各個領域,並針對每個領域(產品,葡萄酒,水果)查看是否包含給定的服務,以便我可以返回並為需要它的每種服務生成產品,葡萄酒或水果。 但是我不想重復多次服務名稱。 生成的JSON應該如下所示:

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

希望是要在Angular中生成一個動態列表,我可以通過此JSON進行循環切換,並提取每種產品,水果,葡萄酒和其他產品的值。

我一直在嘗試很多嵌套的for循環之類的東西,但是每當向下延伸一層以上時,這種動力似乎就停止了。 我猜想要實現此目的,我需要在JS Objects和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需要遍歷所有的服務和一個對象中積累的結果。 然后,針對每個服務字段進行迭代,以僅filter出包含此服務鏈接的字段。 最后,將過濾后的字段列表轉換( map )為字符串列表(其名稱)並插入累加器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM