2017-09-04 75 views
6

例如破壞屬性的一部分,我有這樣的對象:如何從一個對象

obj1 = { 
    name: 'Bob', 
    age: 20, 
    career: 'teacher' 
    } 

現在我需要複製其屬性的一部分,而不是全部。

obj2 = { 
    name: '', 
    age: '', 
    } 

我知道我能做到像obj2.name = obj1.name,這將是冗長的,如果許多特性需要被複制。有沒有其他快速的方法來解決這個問題? 我試圖

let {name: obj2.name, age: obj2.age} = obj1;

,但得到的錯誤。

+0

您可以使用白色列表來查看屬性或黑名單。然後迭代。 –

+0

看看[這個](https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object) – Max

+0

看一看[單線性採取一些屬性從ES6中的對象](https://stackoverflow.com/q/25553910/1048572) – Bergi

回答

5

其實你不需要對象解構,只是簡單的任務:現在

obj2 = { name: obj1.name, age: obj1.age } 

obj2抱希望性質:

console.log(obj2); 
// Prints {name: "Bob", age: 20} 

如果要合併的obj2老性質與新的,你可以這樣做:

obj2 = { ...obj2, name: obj1.name, age: obj1.age } 
2

let(你不聲明變量)和surround with parentheses

({name: obj2.name, age: obj2.age} = obj1); 
+0

你的代碼不起作用,它應該是'(obj1 = {name:obj2.name,age:obj2.age}); ' – alexmac

+0

它的工作原理!你能否解釋爲什麼或者括號是做什麼的。 –

+0

@alexmac它確實有效。嘗試一下。這是解構。 – Bergi

0

我想你可以使用ES6對象解構語法

var obj = { name: 'kailash', age: 25, des: 'backenddev'} 
    ({name} = obj); 
+0

分配給全局'name'變量? – Bergi

+0

是的,它確實分配給全局名稱var –

+0

是的 - 不要這樣做:-) – Bergi

0

您可以使用目標對象作爲模板進行屬性並將obj1的值賦予目標對象的默認值。

var obj1 = { name: 'Bob', age: 20, career: 'teacher' }, 
 
    obj2 = { name: '', age: '' }; 
 
    
 
Object.keys(obj2).forEach(k => obj2[k] = obj1[k] || obj2[k]); 
 

 
console.log(obj2);

0

另一種解決方案是寫此一reuable方法。您可以提供一個對象和您想要複製的方法。

const duplicatePropertiesFromObject = (obj, propertyNames = [], newObj = {}) => { 
    Object.keys(obj).forEach((key) => { 
    if (propertyNames.includes(key)) { 
     newObj[key] = obj[key]; 
    } 
    }); 
    return newObj; 
}