簡體   English   中英

用Java編寫部分復制對象的代碼的優雅方法?

[英]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";

jsfiddle

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM