javascript - 在 typeScript 中,如何将对象数组转换为具有动态键的单个对象

在我的angular 7应用程序中,我有以下5个数组需要使用基于id的动态键转换为下面的单个对象。


{


"enabled-41": true,


"enabled-42": true,


"enabled-43": true,


"enabled-44": true,


"enabled-45": false,


"abc-41":"some description 1",


"abc-42":"some description 12",


"abc-43":"some description 123",


"abc-44":"some description 1234",


"abc-45": null,


"def-41":"some description 2",


"def-42":"some description 23",


"def-43":"some description 234",


"def-44":"some description 2345",


"def-45": null,


"type-41":"def",


"type-42":"abc",


"type-43":"def",


"type-44":"abc",


"type-45": null,


"weight-41":"25",


"weight-42":"25",


"weight-43":"25",


"weight-44":"25",


"weight-45": null


}




let arr = [


 {


"id": 41,


"abc":"some description 1",


"def":"some description 2",


"type":"def",


"Criteria": {


"id": 5,


"question":"follow-up",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 42,


"abc":"some description 12",


"def":"some description 23",


"type":"abc",


"Criteria": {


"id": 1,


"question":"coverage",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 43,


"abc":"some description 123",


"def":"some description 234",


"type":"def",


"Criteria": {


"id": 4,


"question":"Price",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 44,


"abc":"some description 1234",


"def":"some description 2345",


"type":"abc",


"Criteria": {


"id": 3,


"question":"Exchange",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 45,


"Criteria": {


"id": 2,


"definition":"definition conent",


"question":"Random",


"status": true


 },


"type": null,


"abc": null,


"def": null,


"weight": 0,


"enabled": false


 }


];



let result = arr.reduce(function(obj, item) {


 obj[item] = item.value;


 return obj;


}, {})



console.log(result);

我已经尝试过使用reduce函数,但是,无法使用基于动 key的上述格式(使用hypen加入id)以正确的方式转换为单个对象。

谁能帮我这个忙?

时间:

你的代码几乎就可以了。 但不能保证对象键的顺序。 在reduce回调函数内部添加累加器中的键和相应的值。

在创建对象键时使用模板文字和方形表示法


let arr = [{


"id": 41,


"abc":"some description 1",


"def":"some description 2",


"type":"def",


"Criteria": {


"id": 5,


"question":"follow-up",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 42,


"abc":"some description 12",


"def":"some description 23",


"type":"abc",


"Criteria": {


"id": 1,


"question":"coverage",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 43,


"abc":"some description 123",


"def":"some description 234",


"type":"def",


"Criteria": {


"id": 4,


"question":"Price",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 44,


"abc":"some description 1234",


"def":"some description 2345",


"type":"abc",


"Criteria": {


"id": 3,


"question":"Exchange",


"definition":"definition content",


"status": true


 },


"weight": 25,


"enabled": true


 },


 {


"id": 45,


"Criteria": {


"id": 2,


"definition":"definition conent",


"question":"Random",


"status": true


 },


"type": null,


"abc": null,


"def": null,


"weight": 0,


"enabled": false


 }


];



let result = arr.reduce(function(obj, item) {


 obj[`enabled-${item.id}`] = item.enabled;


 obj[`abc-${item.id}`] = item.abc;


 obj[`def-${item.id}`] = item.def;


 obj[`type-${item.id}`] = item.type;


 obj[`weight-${item.id}`] = item.weight;


 return obj;


}, {});


console.log(result)

可以将 reduceObject.keys 一起使用,并将希望排除的所有键放在数组中,并对它的进行检查:


let arr = [{"id":41,"abc":"some description 1","def":"some description 2","type":"def","Criteria":{"id":5,"question":"follow-up","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":42,"abc":"some description 12","def":"some description 23","type":"abc","Criteria":{"id":1,"question":"coverage","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":43,"abc":"some description 123","def":"some description 234","type":"def","Criteria":{"id":4,"question":"Price","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":44,"abc":"some description 1234","def":"some description 2345","type":"abc","Criteria":{"id":3,"question":"Exchange","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":45,"Criteria":{"id":2,"definition":"definition conent","question":"Random","status":true},"type":null,"abc":null,"def":null,"weight":0,"enabled":false}];



let exclude = ["id","Criteria"];



let result = arr.reduce((acc, curr) => {


 let id = curr.id;


 Object.entries(curr).forEach(([k, v]) => {


 if (!exclude.includes(k)) acc[`${k}-${id}`] = v;


 });


 return acc;


}, {});



console.log(result);

假设你要排除其值为 object 的所有属性,你可以使用这个 Object.entries() 来遍历内部对象和一些 destructuring 功能的通用概念 。


let arr=[{"id":41,"abc":"some description 1","def":"some description 2","type":"def","Criteria":{"id":5,"question":"follow-up","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":42,"abc":"some description 12","def":"some description 23","type":"abc","Criteria":{"id":1,"question":"coverage","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":43,"abc":"some description 123","def":"some description 234","type":"def","Criteria":{"id":4,"question":"Price","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":44,"abc":"some description 1234","def":"some description 2345","type":"abc","Criteria":{"id":3,"question":"Exchange","definition":"definition content","status":true},"weight":25,"enabled":true},{"id":45,"Criteria":{"id":2,"definition":"definition conent","question":"Random","status":true},"type":null,"abc":null,"def":null,"weight":0,"enabled":false}];



let result = arr.reduce((obj, {id,.. .rest}) =>


{


 Object.entries(rest).forEach(([k, v]) =>


 {


 if (Object(v)!== v) obj[`${k}-${id}`] = v;


 });



 return obj;


}, {});



console.log(result);

.as-console {background-color:black!important; color:lime;}


.as-console-wrapper {max-height:100%!important; top:0;}

哦, 这是我的解决方案。


let arr= []//hold the final object array


let keys = []//temp item to hold the value of each key



//iterate over each key


 Object.keys(input).forEach((key) => { 


 let pair = key.split('-')//split the key into the real key and the index



//if the index isn't in the array, push it there (this keeps the same order)


 if (keys.indexOf(pair[1])===-1) { 


 keys.push(pair[1])


 }



//use object.assign to add the keys to the existing object in the right place in the array. 


 arr[keys.indexOf(pair[1])] = Object.assign({}, arr[keys.indexOf(pair[1])], {[pair[0]]: input[key]}, { id: pair[1] }) 



})



...