2015-04-14 2 views
1

В следующем сегменте кода я пытаюсь создать хеш-таблицу с одним ключом с именем «один» и нажать одно значение «ted» в массив.Coffescript, создающий хэш-таблицу

out = {}; 
for i in [1..10] 
    key = "one"; 
    if(key not in out) 
    out[key] = []; 
    out[key].push("ted") 
    console.log("pushing ted"); 

console.log(out); 

Что мне не хватает? Кажется, что выход:

pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
{ one: [ 'ted' ] } 

Я ожидаю, что выход будет:

pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
pushing ted 
{ one: [ 'ted','ted','ted','ted','ted','ted','ted','ted','ted','ted' ] } 

Вот скрипку: http://jsfiddle.net/u4wpg4ts/

ответ

3

in ключевое слово CoffeeScript не означает то же самое, это происходит в JavaScript. Он будет проверять наличие значения, а не ключа.

# coffee 
if (key not in out) 
// .js (roughly) 
indexOf = Array.prototype.indexOf; 

if (indexOf.call(out, key) < 0) 

Поскольку ключ ("one") никогда не присутствует в массиве в качестве значения ("ted"), условие всегда проходит. Таким образом, массив заменяется и сбрасывается до пустого перед каждым .push().

CoffeeScript-х of keyword вместо этого будет проверять присутствие ключа, который должен только пройти в первый раз:

# coffee 
if (key not of out) 
// .js 
if (!(key in out)) 
+1

Вы могли бы также 'из [ключ] = [] или' из [? key] || = [] 'вместо' if'. Или даже '(out [key]? = []). Push ('ted')' или '(out [key] || = []). Push ('ted')'. –

Смежные вопросы