这是替换第一次出现的东西的最好方法吗?
my_list[my_list.indexOf(old_item)] = new_item
注意:如果该项不在数组中,我不希望发生任何事情。 (没有错误/损坏的数组)
答案 0 :(得分:2)
如果您不确定该项目是否在列表中,您应该这样做:
var idx = my_list.indexOf(old_item)
if (idx !== -1) { my_list[idx] = new_item }
但我认为这是最好的方法。
在索引-1处设置值不会引发错误,但仍会修改对象,就像在通用js对象中设置键一样:
var my_list = [1, 2, 3];
var old_item = 5;
var new_item = 10;
my_list[my_list.indexOf(old_item)] = new_item;
// my_list is [1, 2, 3, '-1': 10]
// my_list.length is still 3
// Object.keys(my_list) is [ '0', '1', '2', '-1' ]
所以你可能不想这样做。
答案 1 :(得分:0)
不是真的!有几种方法可以做到 - 一种是你拥有的方式,另一种是使用search
方法而不是indexOf
,这种方法更通用,因为它可以接受正则表达式参数。但请注意,某些较旧的JS环境不支持search
。还有更长,更糟糕的方式,比如使用filter
或splice
,但这些方法肯定不会更好。
我提出的唯一建议是检查old_item是否仍然在列表中的条件 - indexOf
如果列表中没有某些内容则返回-1
,在这种情况下,你'将替换不存在的索引。
基本上,我认为你很好 - 它可能不是最漂亮的表达,但它与JS中的简洁一样简洁。
答案 2 :(得分:0)
数组不是搜索值的有用结构。您可以考虑使用一组:
my_set.delete(old_item);
my_set.add(new_item);
请注意,如果数组中未显示old_item
,您的代码可能无法按预期运行,则indexOf
将返回-1
。也许使用这样的东西:
var idx = my_list.indexOf(old_item);
if (idx >= 0) my_list[idx] = new_item;
else my_list.push(new_item);
答案 3 :(得分:0)
indexOf
绝对是最好的方式之一。但是你想在使用之前确保indexOf
成功:
var index = my_list.indexOf(old_item);
if (index !== -1) {
my_list[index] = new_item;
}
如果您使用简洁的JavaScript,也可以使用~
运算符:
var index = my_list.indexOf(old_item);
if (~index) {
my_list[index] = new_item;
}
答案 4 :(得分:0)
使用Array.prototype.indexOf
和Array.prototype.splice
函数的快速解决方案:
var myList = [1,2,3,4,5], oldItem = 4, newItem = 7;
~(pos = myList.indexOf(oldItem)) && myList.splice(pos, 1, newItem);
console.log(myList);