JavaScript for循环打印意外的迭代器值

时间:2017-02-14 01:02:08

标签: javascript arrays loops object

我正在编写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。有更优雅的方法吗?

1 个答案:

答案 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;
}