2017-05-18 49 views
1

我用ES6和Babel編寫一些代碼atm(es2015預設),我無法傳播一個對象,因爲我習慣於。通常情況下,我會拍攝一個對象,使用擴展並映射內部內容,如[...someObject].map(dosomestuff)。但正如預期的我的一個對象的行爲不和我發現的唯一相差這麼遠的關鍵是:傳播操作符不工作字符串作爲鍵的對象

let myObject = { 
    'key': content, 
    'key2': content, 
    'key3': content 
}; 

let array = [...myObject]; 

由於對象被生成的表單中,密鑰由變量形成的文件結構,可以包含特殊字符,所以我需要將它們設置爲object[key] = value。爲什麼不能在該對象上使用spread運算符(數組總是空的)?是否有一個解決方法,就像擴散運算符一樣舒適(我不是指用Object.keys創建一個新的Array並使用它)

+1

這裏期望的結果是什麼? –

+0

我想要一個數組,我可以像[內容,內容,內容]一樣映射。map(doSomething) – knigge

+0

您可以將鍵映射到值或使用Object.values(myObject) –

回答

0

使用Chrome我發現在對象上使用擴散會導致異常。使用什麼工作Map

1

對象spread適用於工作站,您不能將對象傳播到array

你應該把它spread到另一個對象:

let myObject = { 
 
    'key': "content1", 
 
    'key2': "content2", 
 
    'key3': "content3" 
 
}; 
 

 
let myObject2 = { 
 
    'key4': 'content4' 
 
} 
 

 
let newObj= {...myObject, ...myObject2}; 
 
console.log(newObj);

這不是ES6的一部分,但它是在stage 3

+1

這是無效的ES6。 –

+0

使用'babel' https://babeljs.io/docs/plugins/transform-object-rest-spread/ –

+0

當然,但有人應該如何從你的答案中推論出來? –

1

爲什麼不能我使用擴操作在那個對象上?

首先,... is not an operator!

您只能使用傳播元素時,該元素是可迭代。對象不可迭代。

而且有一種解決方法那得舒適傳播運營商(我不意味使與Object.keys一個新的陣列和使用)

不在ES6。

我假設你想從對象中獲取屬性

如果不婉寫一個輔助函數,並不一定要使用傳播元素,你其實可以利用Array.from的採取映射函數作爲第二個參數的能力:

Array.from(Array.keys(myObject), x => myObject[x]); 

如果你真的不想使用Object.keysObject.values在ES6不存在),那麼你可以自己編寫自己的輔助函數作爲發電機:

function* values(obj) { 
 
    for (var x in obj) { 
 
    // You can use `obj.hasOwnProperty(x)` to guard against inherited properties 
 
    // to achieve the same effect as `Object.keys` 
 
    yield obj[x]; 
 
    } 
 
} 
 

 
let myObject = { 
 
    'key': 'content', 
 
    'key2': 'content1', 
 
    'key3': 'content2' 
 
}; 
 

 
console.log([...values(myObject)]); 
 
// or 
 
console.log(Array.from(values(myObject)));