从现有的JSON构建新的JSON

时间:2016-09-22 07:12:41

标签: javascript json angular typescript

我想从现有的JSON构建一个新的{ "items": [ { "id": 10000006, "name": "Boah" }, { "id": 10000013, "name": "Gut" }, { "id": 10000003, "name": "Ipsum" }, { "id": 10000001, "name": "Lorem" }, { "id": 10000005, "name": "Lorum" }, { "id": 10000004, "name": "Name" }, { "id": 10000002, "name": "Stet" } ] } 。源代码包含我不再需要列表的部分和规则。新对象名为' items'应该有一个项目数组。

最终的JSON应按属性' name'进行排序。看起来像

{
  "sections": [
    {
      "name": "FooBar",
      "rubrics": [
        {
          "name": "Foo",
          "items": [
            {
              "id": 10000001,
              "name": "Lorem"
            },
            {
              "id": 10000002,
              "name": "Stet"
            },
            {
              "id": 10000003,
              "name": "Ipsum"
            }
          ]
        },
        {
          "name": "Bar",
          "items": [
            {
              "id": 10000004,
              "name": "Name"
            },
            {
              "id": 10000005,
              "name": "Lorum"
            },
            {
              "id": 10000006,
              "name": "Boah"
            }
          ]
        }
      ]
    },
    {
      "name": "BlahBloob",
      "rubrics": [
        {
          "name": "Bla",
          "items": [
            {
              "id": 10000013,
              "name": "Gut"
            }
          ]
        },
        {
          "name": "Bloob",
          "items": [
            {
              "id": 10000014,
              "name": "Name"
            },
            {
              "id": 10000015,
              "name": "Lorem"
            }
          ]
        }
      ]
    }
  ]
}

为了构建新的JSON,我得到了这个来源:

JavaScript
你怎么看?如何使用普通TypeScriptIndexPath来完成此操作?

感谢阅读并有时间回答我的问题。并感谢您提前回复。

4 个答案:

答案 0 :(得分:2)

你走了。您只需要遍历源的每个部分的每个量规来获取项目。最后,按项目对项目列表进行排序,然后就完成了。

此示例使用ES6语法,但如果需要,可以很容易地将其转换为ES5。

var rule = new LoggingRule("*", dbTarget);

答案 1 :(得分:2)

更实用的方法是使用地图缩小来挑选规则并合并它们。

data.sections
  .map(section => section.rubrics) // get rubrics
  .reduce((a, b) => a.concat(b)) // merge rubrics
  .map(rubric => rubric.items) // get items from each rubric
  .reduce((a, b) => a.concat(b)) // merge items
  .sort((a, b) => a.name.localeCompare(b.name)); // sort

答案 2 :(得分:1)

  JsonSerializer serializer = new JsonSerializer(); 
            dynamic item = serializer.Deserialize<object>("
{"val1":["dfgdsfgdfgsdf"],"val2":258915,"val3":"PPaaaA","val4":null,

    "valJSON":"[{\"TypeID\":\"Z_FI_MDG\",\"SeverityCode\":\"3\",\"Note\":\"\\\"zczczca \\\\\\\"leading zero\\\\\\\". \\\\\\\\r\\\\\\\\n•YYY: Institution\"}]"}

");

只需使用function(oldObj) { var newObj = { "items": [] }; oldObj.sections.forEach(function(section) { section.rubrics.forEach(function(rubric) { rubric.items.forEach(function(item) { newObj.items.push(item); }); }); }); newObj.items = newObj.items.sort(function(a, b) { if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; }); return newObj; } JSON.parse()将JSON转换为对象即可。

答案 3 :(得分:0)

可能会对您有所帮助

var data ={
	"sections": [
{
"name": "FooBar",
"rubrics": [{"name": "Foo", "items": [{"id": 10000001,"name": "Lorem"}, {"id": 10000002,"name": "Stet"}, {"id": 10000003,"name": "Ipsum"}]
}, {
			"name": "Bar",
			"items": [{
				"id": 10000004,
				"name": "Name"
			}, {
				"id": 10000005,
				"name": "Lorum"
			}, {
				"id": 10000006,
				"name": "Boah"
			}]
		}]
	}, {
		"name": "BlahBloob",
		"rubrics": [{
			"name": "Bla",
			"items": [{
				"id": 10000013,
				"name": "Gut"
			}]
		}, {
			"name": "Bloob",
			"items": [{
				"id": 10000014,
				"name": "Name"
			}, {
				"id": 10000015,
				"name": "Lorem"
			}]
		}]
	}]
};
var itemObj = {};
var itemArr = [];
var sections = data.sections;
for(var i=0;i<sections.length;i++)
{	
  for(var j=0;j<sections[i].rubrics.length;j++){    
    for(var k=0;k<sections[i].rubrics[j].items.length;k++){      
      var itemObj;
      itemObj['id'] = sections[i].rubrics[j].items[k].id;
      itemObj['name'] = sections[i].rubrics[j].items[k].name;      
      itemArr.push(itemObj);
    }
  }
}
var finalObj = {"items":itemArr};
console.log(finalObj);

JSFiddle