2017-02-14 78 views
0

我在寫function objectify(str),它接受一個字符串,將它變成一個數組,並使用鍵值對分別創建一個新對象作爲數組的字和索引,例如。用於循環的JavaScript打印出意外的迭代器值

objectify('the cat sat on the mat') 

=> {的:0,貓:1,飽和:2,上:3,墊:4}

我寫這樣的功能:

function objectify(str) { 
    var words = str.split(' '); 
    var object = {} 
    for (var i = 0; i < words.length; i++) { 
    object[words[i]] = i; 
    } 
    return object; 
} 

其印刷:

=> {的:4,貓:1,飽和:2,上:3,墊:5}

Q1。 i在這種情況下做什麼?

我知道輸出我想要的功能需要被寫入像這樣:

function countWords(str) { 
    var words = str.split(' '); 
    var object = {} 
    for (var i = 0; i < words.length; i++) { 
    object[words[i]] = words.indexOf(words[i]); 
    } 
    return object; 
} 

Q2。有沒有更優雅的方式來做到這一點?

回答

2

問題是「the」出現在短語兩次,並且您的循環按升序工作。 「the」的第二個實例會將the屬性更新爲更大的值。聽起來就像你不想要那樣。相反,它聽起來像你希望較小的值優先。

您有兩種選擇。

做它倒退。較小的值將優先考慮,因爲它們會覆蓋較大的值。

function objectify(str) { 
    var words = str.split(' '); 
    var object = {} 
    for (var i = words.length-1; i >=0; i--) { 
    object[words[i]] = i; 
    } 
    return object; 
} 

檢查存在。通過確保該屬性尚未定義,防止較大的值覆蓋較小的值。

function objectify(str) { 
    var words = str.split(' '); 
    var object = {} 
    for (var i = 0; i<words.length; i++) { 
    if (!object.hasOwnProperty(words[i])) { 
     object[words[i]] = i; 
    } 
    } 
    return object; 
}