[英]Elegant way to code partially copy objects in Javascript?
我有一个表示表单字段的JavaScript对象。 这些字段中约有70%必须复制到某些对象中才能发送到服务器,其他字段则用于UI。 目前,我通过为每个字段手动创建分配来克隆对象,这导致结构不太好,如下所示。 请注意,对于要复制的部分,我将保持字段名称相同。
var contData = {
ContainerType: data.ContainerType,
ProjectIds: data.ProjectIds,
PrivateToProjects: data.PrivateToProjects,
DimensionType:data.DimensionType,
MetricsX: data.MetricsX,
MetricsY: data.MetricsY,
Parent:data.Parent,
ContainerName:data.Prefix
};
仅指定要克隆/不克隆的字段列表(例如一些有用的辅助函数),对对象的部分进行编码的最佳方法是什么?
我也使用angular和jquery。
在ES6之后,您可以
let { ContainerType, ProjectIds } = data // the fields you want
let partiallyCopy = { ContainerType, ProjectIds }
console.log(partiallyCopy) // { ContainerType: "...", ProjectIds: "..." }
如果您需要大多数领域,则可以
let { ContainerType, ProjectIds, ...rest } = data // the fields you don't want
let partiallyCopy = rest
console.log(partiallyCopy) // the object excludes ContainerType and ProjectIds
您可以创建一个自定义函数,以使用过滤器函数部分克隆对象。
可能是像这样的非常简单的版本。
function filteredClone(sourceObj, filterFunction){
var destObj = {};
for(var i in sourceObj){
if(filterFunction(sourceObj[i])){
destObj[i] = sourceObj[i];
}
}
return destObj;
}
假设您不想复制“名称”和“姓氏”字段,则可以像下面这样调用它。
var dest = filteredClone(source, function(v){
return ["name","surname"].indexOf(v) !== -1;
});
以下问题的答案中有两个更复杂的示例。
一种方法是定义对象的属性。 IE9是第一个支持此功能的IE。
var obj = {};
Object.defineProperty(obj, "no1", {enumerable: false, value: "", writable: true, configurable: true});
Object.defineProperty(obj, "no2", {enumerable: false, value: "", writable: true, configurable: true});
obj.yes1 = "foo";
obj.yes2 = "bar";
obj.no1 = "baz";
obj.no2 = "quux";
99.9%的克隆功能将在键上循环,并且只会显示可枚举的键,因此它们仅复制可枚举的键。 这就是为什么循环遍历对象的键时,例如toString
不显示的相同原因。
可以将其抽象化以允许定义数据和临时值。
function makeType(description, data) {
if (arguments.length === 1) {
return function (data) {
return makeType.call(this, description, data);
};
}
var obj = {};
data = data || {};
for (var key in description) {
if (description[key] === true) {
obj[key] = data[key]
} else {
Object.defineProperty(obj, key, {
enumerable: false,
value: data[key],
writable: true,
configurable: true
});
}
}
return obj;
}
var makeYesNo = makeType({
yes1: true,
yes2: true,
no1: false,
no2: false
});
var obj = makeYesNo({
yes1: "foo",
yes2: "bar",
no1: "baz",
no2: "quux"
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.