具有属性子集的对象数组克隆

Posted

技术标签:

【中文标题】具有属性子集的对象数组克隆【英文标题】:Object array clone with subset of properties 【发布时间】:2015-08-20 07:31:33 【问题描述】:

javascript 中,将一组统一对象克隆为一个具有每个对象的属性子集的最有效方法是什么?

更新

这是最有效的方法还是有更好的方法? -

var source = [
    
        id: 1,
        name: 'one',
        value: 12.34
    ,
    
        id: 2,
        name: 'two',
        value: 17.05
    
];

// copy just 'id' and 'name', ignore 'value':
var dest = source.map(function (obj) 
    return 
        id: obj.id,
        name: obj.name
    ;
);

【问题讨论】:

How to get a subset of a javascript object's properties 的可能重复项 @artm,这个问题是关于一个对象的,而我问的是一组对象。 @Khalid,这个问题不包括属性的子集。 好吧,例如,您可以使用***.com/a/17781590/3309109 并为数组中的每个对象调用它。 【参考方案1】:

使用对象解构和属性简写

let array = [ a: 5, b: 6, c: 7 ,  a: 8, b: 9, c: 10 ];
let cloned = array.map(( a, c ) => ( a, c ));

console.log(cloned); // [ a: 5, c: 7 ,  a: 8, c: 10 ]

【讨论】:

【参考方案2】:

首先定义一个克隆对象并返回属性子集的函数,

Object.prototype.pick = function (props) 
   return  props.reduce((function (obj, property) 
        obj[property] = this[property];
        return obj;
   ).bind(this), );

然后定义一个函数来克隆一个数组并返回每个对象的子集

function  cloneArray (array, props)  
    return array.map(function (obj)  
       return obj.pick(props);
    );

现在假设你有这个数组:

var array = [
    name : 'khalid', city : 'ifrane', age : 99 ,
    name : 'Ahmed', city : 'Meknes', age : 30 
];

您需要调用该函数并传递您需要获取的属性数组作为结果

cloneArray(array, ['name', 'city']);

结果将是:

[
    name : 'khalid', city : 'ifrane' ,
    name : 'Ahmed', city : 'Meknes' 
]

【讨论】:

这比我想要的答案更通用,即我不介意在复制操作期间指定列。您的答案更可重复使用和清洁。谢谢!【参考方案3】:

就性能而言,这将是最有效的方法,是的。

【讨论】:

谢谢!我在第一个答案之后做了更新,它提供了一个非常好的和更通用的方法。

以上是关于具有属性子集的对象数组克隆的主要内容,如果未能解决你的问题,请参考以下文章

如何检查包含另一个对象数组的对象数组是不是具有属性

克隆解析服务器对象

在子集合中的项目内容上创建计算属性

如何将具有元素数组的每个对象的对象列表转换为具有子元素作为属性的对象数组

尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?

将数据数组转换为具有属性的对象[重复]