如何替换数组中的项目?

IT技术 javascript arrays
2021-02-06 04:36:35

这个数组的每一项都是一些数字:

var items = Array(523,3452,334,31, ...5346);

如何用新物品替换某些物品?

例如,我们想替换34521010,我们将如何做到这一点?

6个回答
var index = items.indexOf(3452);

if (index !== -1) {
    items[index] = 1010;
}

此外,建议您不要使用构造函数方法来初始化数组。相反,使用文字语法:

var items = [523, 3452, 334, 31, 5346];

~如果您喜欢简洁的 JavaScript 并想缩短-1比较,您也可以使用运算符

var index = items.indexOf(3452);

if (~index) {
    items[index] = 1010;
}

有时我什至喜欢写一个contains函数来抽象这个检查,让我更容易理解发生了什么。很棒的是,这对数组和字符串都有效:

var contains = function (haystack, needle) {
    return !!~haystack.indexOf(needle);
};

// can be used like so now:
if (contains(items, 3452)) {
    // do something else...
}

从用于字符串的 ES6/ES2015 开始,并为用于数组的 ES2016 提议,您可以更轻松地确定源是否包含另一个值:

if (haystack.includes(needle)) {
    // do your thing
}
@ValRob 您可以使用findIndex. 看到这个答案:stackoverflow.com/a/53952276/2430274
2021-03-15 04:36:35
@coderboy 有点晚了,但indexOf如果在数组中找不到要搜索的值,函数将返回 -1。
2021-03-18 04:36:35
请问比较中的 index !== -1 是什么意思。谢谢
2021-04-02 04:36:35

Array.indexOf()方法将替换第一个实例。要获取每个实例,请使用Array.map()

a = a.map(function(item) { return item == 3452 ? 1010 : item; });

当然,这会创建一个新数组。如果您想就地进行,请使用Array.forEach()

a.forEach(function(item, i) { if (item == 3452) a[i] = 1010; });
array.map 还在它们的第二个参数中返回索引 a = a.map(function(item,key) { if (item == 3452) a[key] = 1010; });
2021-03-17 04:36:35
@Rickysharma 您也可以为地图执行此操作,但是,它只会重写旧数组中的值,然后创建该值的副本并返回它。因此,三元运算符的工作效率更高。
2021-03-18 04:36:35
对于阅读本文的其他人。map() 和 forEach() 都是 Javascript 规范的新补充,在一些较旧的浏览器中不存在。如果你想使用它们,你可能需要为旧浏览器添加兼容代码:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
2021-03-19 04:36:35
Array.indexOf()在同一时间被引入map()forEach()如果您支持 IE8 或更早版本,并且您没有使用 shim 来添加支持,最好使用mellamokb 的答案
2021-04-12 04:36:35

我建议的解决方案是:

items.splice(1, 1, 1010);

拼接操作将删除 1 个项目,从数组中的位置 1 开始(即3452),并将其替换为新项目1010

这是一种误导,因为您暗示第一个参数意味着该1项目将被删除,而实际上第一个参数意味着该操作发生在 index 1developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-06 04:36:35

@gilly3 的回答很棒。

替换对象数组中的对象,保持元素的顺序不变

当我从服务器获取数据时,我更喜欢以下方式将新的更新记录更新到我的记录数组中。它使订单保持完整,并且非常直接地使用一个班轮。

users = users.map(u => u.id !== editedUser.id ? u : editedUser);

var users = [
{id: 1, firstname: 'John', lastname: 'Ken'},
{id: 2, firstname: 'Robin', lastname: 'Hood'},
{id: 3, firstname: 'William', lastname: 'Cook'}
];

var editedUser = {id: 2, firstname: 'Michael', lastname: 'Angelo'};

users = users.map(u => u.id !== editedUser.id ? u : editedUser);

console.log('users -> ', users);

使用indexOf找到的元素。

var i = items.indexOf(3452);
items[i] = 1010;
如果它没有预期的元素怎么办。如果找到,它将返回找到元素的索引,但如果没有找到,它将返回 -1。它将将该值设置为 -1。请参考jsbin.com/wugatuwora/edit?js,console
2021-03-21 04:36:35