厄介な問題を抱えており、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 つのパスを実行する必要がありますか? 他の提案はありますか?