如何用Javascript替换数组中的项?

Jam*_*mes 257 javascript arrays

该数组的每个项目都是一些数字.

var items = Array(523,3452,334,31, ...5346);
Run Code Online (Sandbox Code Playgroud)

如何使用新数组替换数组中的某些数字?

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

Eli*_*Eli 400

var index = items.indexOf(3452);

if (index !== -1) {
    items[index] = 1010;
}
Run Code Online (Sandbox Code Playgroud)

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

var items = [523, 3452, 334, 31, 5346];
Run Code Online (Sandbox Code Playgroud)

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

var index = items.indexOf(3452);

if (~index) {
    items[index] = 1010;
}
Run Code Online (Sandbox Code Playgroud)

有时我甚至喜欢编写一个contains函数来抽象这个检查,并让它更容易理解正在发生的事情.什么是令人敬畏的是这适用于数组和字符串:

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

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

从字符串的ES6/ES2015开始,为阵列的ES2016开始,您可以更轻松地确定源是否包含其他值:

if (haystack.includes(needle)) {
    // do your thing
}
Run Code Online (Sandbox Code Playgroud)

  • 我以为我会给出一个ES6版本的`contains`:`var contains =(a,b)=> !! ~a.indexOf(b)`:P (6认同)
  • @coderboy 有点晚了,但是如果在数组中找不到要搜索的值,则 `indexOf` 函数将返回 -1 。 (2认同)

gil*_*ly3 82

Array.indexOf()方法将取代第一个实例.要使用每个实例Array.map():

a = a.map(function(item) { return item == 3452 ? 1010 : item; });
Run Code Online (Sandbox Code Playgroud)

当然,这会创建一个新阵列.如果您想这样做,请使用Array.forEach():

a.forEach(function(item, i) { if (item == 3452) a[i] = 1010; });
Run Code Online (Sandbox Code Playgroud)

  • 对于其他读这篇文章的人.map()和forEach()都是Javascript规范的新增功能,并且在某些旧版浏览器中不存在.如果要使用它们,可能需要为旧版浏览器添加兼容性代码:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/map (7认同)
  • [`Array.indexOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Browser_compatibility)与`map(同时)同时介绍)`和`forEach()`.如果您支持IE8或更早版本,并且您没有使用垫片来添加支持,请更好地使用[mellamokb的答案](http://stackoverflow.com/a/5915816/361684). (2认同)

mua*_*f80 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);
Run Code Online (Sandbox Code Playgroud)

  • 这对原始发布者来说可能并不重要,但值得注意的是,该解决方案创建了一个新数组,这在某些情况下可能会出现问题(即,角度参考更改检测)。 (3认同)

小智 28

我建议的解决方案是:

items.splice(1, 1, 1010);
Run Code Online (Sandbox Code Playgroud)

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

  • 这令人产生误解,因为您暗示第一个参数实际上将删除“ 1”项,而实际上第一个参数意味着该操作发生在索引“ 1”处。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice (2认同)

Tes*_*rex 25

使用indexOf查找元素.

var i = items.indexOf(3452);
items[i] = 1010;
Run Code Online (Sandbox Code Playgroud)

  • 如果它没有预期的元素怎么办?如果找到,它将返回找到的元素的索引,但如果没有,它将返回-1。它将将该值设置为 -1。请参考 https://jsbin.com/wugatuwora/edit?js,console (3认同)

Gom*_*oms 21

第一种方法

在一行中替换或更新数组项的最佳方法

array.splice(array.indexOf(valueToReplace), 1, newValue)
Run Code Online (Sandbox Code Playgroud)

例如:

let items = ['JS', 'PHP', 'RUBY'];

let replacedItem = items.splice(items.indexOf('RUBY'), 1, 'PYTHON')

console.log(replacedItem) //['RUBY']
console.log(items) //['JS', 'PHP', 'PYTHON']
Run Code Online (Sandbox Code Playgroud)

第二种方法

执行相同操作的另一种简单方法是:

items[items.indexOf(oldValue)] = newValue
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果在原始数组中找不到要替换的值,这两种方法都会出现错误,因为如果未找到该元素,Array.indexOf() 将返回 -1。 (4认同)

mel*_*okb 20

通过for循环轻松完成.

for (var i = 0; i < items.length; i++)
    if (items[i] == 3452)
        items[i] = 1010;
Run Code Online (Sandbox Code Playgroud)

  • 很容易,但不一定有效;) (8认同)
  • @Eli:OP不清楚他们是在替换一个实例还是多个实例.我的解决方案处理多个实例 (7认同)
  • 注意:如果您使用嵌套 for 循环,这将是性能最佳的技术,因为一旦找到并替换所需的所有元素,您就可以中断循环 (2认同)

Ame*_*icA 15

ES6方式:

const items = Array(523, 3452, 334, 31, ...5346);
Run Code Online (Sandbox Code Playgroud)

我们想替换34521010,解决方案:

const newItems = items.map(item => item === 3452 ? 1010 : item);
Run Code Online (Sandbox Code Playgroud)

当然,问题是多年前的问题,现在我更喜欢使用不可变的解决方案,当然,它对于ReactJS.

对于经常使用,我提供以下功能:

const itemReplacer = (array, oldItem, newItem) =>
  array.map(item => item === oldItem ? newItem : item);
Run Code Online (Sandbox Code Playgroud)


Vir*_*oll 13

您可以使用索引编辑任意数量的列表

例如 :

items[0] = 5;
items[5] = 100;
Run Code Online (Sandbox Code Playgroud)


Pur*_*lex 7

使用 ES6 扩展运算符和.slice方法替换列表中元素的不可变方式。

const arr = ['fir', 'next', 'third'], item = 'next'

const nextArr = [
  ...arr.slice(0, arr.indexOf(item)), 
  'second',
  ...arr.slice(arr.indexOf(item) + 1)
]
Run Code Online (Sandbox Code Playgroud)

验证是否有效

console.log(arr)     // [ 'fir', 'next', 'third' ]
console.log(nextArr) // ['fir', 'second', 'third']
Run Code Online (Sandbox Code Playgroud)


bma*_*ggi 7

在javascript中替换数组元素的功能方法:

const replace = (array, index, ...items) => [...array.slice(0, index), ...items, ...array.slice(index + 1)];
Run Code Online (Sandbox Code Playgroud)


Yat*_*rix 5

如果使用复杂的对象(甚至是简单的对象)并且可以使用es6,那Array.prototype.findIndex是一个很好的选择。对于OP的阵列,他们可以做到,

const index = items.findIndex(x => x === 3452)
items[index] = 1010
Run Code Online (Sandbox Code Playgroud)

对于更复杂的对象,这确实很有用。例如,

const index = 
    items.findIndex(
       x => x.jerseyNumber === 9 && x.school === 'Ohio State'
    )

items[index].lastName = 'Utah'
items[index].firstName = 'Johnny'
Run Code Online (Sandbox Code Playgroud)


小智 5

替换可以一行完成:

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

items[items.map((e, i) => [i, e]).filter(e => e[1] == 3452)[0][0]] = 1010

console.log(items);
Run Code Online (Sandbox Code Playgroud)

或创建一个函数以重用:

Array.prototype.replace = function(t, v) {
    if (this.indexOf(t)!= -1)
        this[this.map((e, i) => [i, e]).filter(e => e[1] == t)[0][0]] = v;
  };

//Check
var items = Array(523, 3452, 334, 31, 5346);
items.replace(3452, 1010);
console.log(items);
Run Code Online (Sandbox Code Playgroud)