【问题标题】:A string with values vs an array of values具有值的字符串与值数组
【发布时间】:2016-05-24 16:54:08
【问题描述】:

我正在使用的一个文件是在我开始在这里工作很久之前制作的,它有一个包含 53 个不同数值的列表。但它将它们全部列为用逗号分隔的字符串,例如:

var numbers = "1,2,3,4,5,...,48,49,50";

在脚本的后面,当检查传入的变量是否存在时,它使用:

if(numbers.indexOf(String(x),0) < 0) {/*do stuff*/} else {/*do other stuff*/}

虽然这可行,但我不禁想知道为什么选择这种方式而不是使其成为一个数字数组。就性能而言,这会比按照当前设置的方式进行更优化吗?

【问题讨论】:

  • 为什么?因为你之前的那个人认为这是个好主意。如果您经常查找,那么您应该将其转换为数组since indexOf is pretty slow,并且数据似乎暗示了一个数组。
  • 可能是在支持数组 indexOf 之前编写的。但是字符串 indexof 存在缺陷,因为它会进行部分匹配。
  • 如果字符串不包含4 并且包含14,如果您检查了4 的索引,它将在14 中返回4 的索引。但如果是数组,它将返回 -1.
  • 我建议使用以数字为键的对象。访问速度比 indexOf 快得多。
  • 或者事件最好使用 ES6 set,因为这正是它的设计目的。

标签: javascript arrays string if-statement


【解决方案1】:

关于更快访问带有值的字符串内容的建议,用逗号分隔一个对象。

var numbers = "1,2,3,4,5,6,48,49,50",
    object = Object.create(null), // create empty object without any properties/prototypes
    x = 48;

numbers.split(',').forEach(function (a, i) {
    object[a] = i; // position of item
});

// usage
if (x in object) {
    /*do stuff*/
    alert('pos: ' + object[x]);
} else {
    /*do other stuff*/
}

【讨论】:

  • x = 48; 行是什么意思..?
  • @Redu,它只是一个要搜索的值的示例。
猜你喜欢
  • 1970-01-01
  • 2020-12-01
  • 2020-03-30
  • 2016-12-10
  • 2017-06-06
  • 1970-01-01
  • 2018-06-11
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多