从另一个对象数组创建对象数组

4
我有一个对象,如下所示:
 {
    "id": 1,
    "dataLockVersion": 0,
    "auditData": {
      "createDate": "2018-09-18T11:41:28.362",
      "createUser": "XXX",
      "updateDate": null,
      "updateUser": null
    },
    "property1": 14021,
    "property2": {...},
    "property3": "Obj"
  }

我有一个包含多个这种格式对象的数组。
我想要从这个数组创建一个新的对象数组,这个数组将包含以下格式的对象:
{
    "property1": 14021,
    "property2": {...},
    "property3": "Obj"
  }

这是我尝试的代码:
var result = [];
for (i = 0; i < arr.length; i++) {
    delete arr[i].auditData;
    delete arr[i].dataLockVersion;
    delete arr[i].domainObjectDescription;
    delete arr[i].id;
    result.push(arr[i]);
}

这样做有更好的方法吗?

我已经更新了我的答案,添加了一种“创新”的方法!你也可以检查一下。 - Hassan Sadeghi
你可以使用重组赋值,检查我的答案。 - sumit
6个回答

3

使用map和对象解构

const result = array
                   .map(
                       ({ property1, property2, property3 })
                       => ({ property1, property2, property3 }));

1

我会使用lodash.pick作为一种简洁高效的解决方案。

很多时候,这种逻辑在应用程序的其他部分也会需要。

在您的情况下,它将是:

var newArrayWithPickedProperties = array.map(item => {
  return _.pick(item, ['property1', 'property2', 'property3']);    
})

如果您选择这种方法,请确保只 导入lodash.pick 而不是整个lodash库。

1
你可以简单地使用 Array.map() 和对象 解构 来实现这个功能:

let arr =[{ "id": 1, "dataLockVersion": 0, "auditData": { "createDate": "2018-09-18T11:41:28.362", "createUser": "XXX", "updateDate": null, "updateUser": null }, "property1": 14021, "property2": {"x" :1}, "property3": "Obj" }, { "id": 1, "dataLockVersion": 0, "auditData": { "createDate": "2018-09-18T11:41:28.362", "createUser": "XXX", "updateDate": null, "updateUser": null }, "property1": 14021, "property2": {"x" :12}, "property3": "Obj" }];
  
let result = arr.map(({property1,property2,property3})=>Object.assign({},{property1,property2,property3}));
console.log(result);


1
你可以尝试这个:

 var data = [
    {"id": 1,"dataLockVersion": 0,"auditData": {"createDate": "2018-09-18T11:41:28.362","createUser": "XXX","updateDate": null,"updateUser": null},"property1": 14021,"property2": {},"property3": "Obj"},
    {"id": 2,"dataLockVersion": 1,"auditData": {"createDate": "2018-09-18T11:41:28.362","createUser": "YYY","updateDate": null,"updateUser": null},"property1": 140221,"property2": {},"property3": "Obj3"}
];

var res = data.map(function(m){return {property1: m.property1, property2: m.property2, property3: m.property3};})

console.log(res);


或者,如果你喜欢技巧,并且所有值都是字符串、数字或包含它们的对象,你可以使用以下方法(在非常重的对象中不建议使用):

let data = [
        {"id": 1,"dataLockVersion": 0,"auditData": {"createDate": "2018-09-18T11:41:28.362","createUser": "XXX","updateDate": null,"updateUser": null},"property1": 14021,"property2": {},"property3": "Obj"},
        {"id": 2,"dataLockVersion": 1,"auditData": {"createDate": "2018-09-18T11:41:28.362","createUser": "YYY","updateDate": null,"updateUser": null},"property1": 140221,"property2": {},"property3": "Obj3"}
    ];
var res=[];
JSON.stringify(data).replace(/"(property1)"\:(.+?),.+?"(property\d+)"\:(.+?)(?=})/gi, function(a){res.push(JSON.parse("{"+a+"}"));});
console.log(res);


我曾经遇到过类似的问题,尝试解决了将近6个小时,使用map和function进行属性赋值让我恢复了理智。 - SendETHToThisAddress
我很高兴它有用 ;) - Hassan Sadeghi

0

如果数据来源于一个JSON字符串,JSON.parse reviver parameter 可以用来排除属性:

var json = '{"id":1,"dataLockVersion":0,"auditData":{"createDate":"2018-09-18T11:41:28.362","createUser":"XXX","updateDate":null,"updateUser":null},"property1":14021,"property2":"{...}","property3":"Obj"}'

var obj = JSON.parse(json, (key, value) => /id|data/i.test(key) ? void 0 : value)

console.log( obj )


0

If you have n number of property with fixed 1st 3 keys, you can do destructuring assignment. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

let data = [
    {"id": 1,"dataLockVersion": 0,"auditData": {"createDate": "2018-09-18T11:41:28.362","createUser": "XXX","updateDate": null,"updateUser": null},"property1": 14021,"property2": {},"property3": "Obj","property4":"yo","property5":"hey"},
    {"id": 2,"dataLockVersion": 1,"auditData": {"createDate": "2018-09-18T11:41:28.362","createUser": "YYY","updateDate": null,"updateUser": null},"property1": 140221,"property2": {},"property3": "Obj3"}
];
const arr=data.map(a=>{
           let {id,dataLockVersion,auditData,...props}=a
           return props;
          }
       )
console.log(arr);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接