替换数组中第一次出现的项目的最佳方法

时间:2017-01-18 22:13:30

标签: javascript

这是替换第一次出现的东西的最好方法吗?

my_list[my_list.indexOf(old_item)] = new_item

注意:如果该项不在数组中,我不希望发生任何事情。 (没有错误/损坏的数组)

5 个答案:

答案 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。还有更长,更糟糕的方式,比如使用filtersplice,但这些方法肯定不会更好。

我提出的唯一建议是检查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.indexOfArray.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);