2017-02-14 72 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; 
}