1

厄介な問題を抱えており、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 オブジェクトと 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);

「undefined のプロパティ 'push' を読み取れません」などのエラーが発生します。これは単一のネストされたループから可能であるように思われますが、おそらく 2 つのパスを実行する必要がありますか? 他の提案はありますか?

4

1 に答える 1

3

私には、複雑すぎるソリューションのように思えます。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すべてのサービスを繰り返し処理し、結果を 1 つのオブジェクトに蓄積する必要があります。次に、サービスごとにフィールドが繰り返されfilter、このサービスへのリンクを含むものだけが除外されます。最後に、フィルタリングされたフィールドのmapリストが文字列のリスト (名前) に変換され ( )、アキュムレータに挿入されます。

于 2015-08-12T21:55:02.570 に答える