我正在编写function objectify(str)
,它接受一个字符串,将其转换为数组并创建一个新对象,其中键值对分别作为数组的单词和索引,例如。
objectify('the cat sat on the mat')
=> {::0,cat:1,sat:2,on:3,mat:4}
我写了这样的函数:
function objectify(str) {
var words = str.split(' ');
var object = {}
for (var i = 0; i < words.length; i++) {
object[words[i]] = i;
}
return object;
}
打印:
=&GT; {:4,cat:1,sat:2,on:3,mat: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。有更优雅的方法吗?
答案 0 :(得分:2)
问题在于&#34;&#34;&#34;在短语中出现两次,并且您的循环按升序运行。第二个实例&#34;&#34;将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;
}