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


315

此数组的每个项目都是一个数字。

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

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

例如,我们要用1010代替3452,我们将如何做?


5
是否需要更改3452的多个实例,或者只是一个?
mellamokb

53
如果黑暗势力不会再增加一个,那将是一个例子。
詹姆斯

2
当有字符串替换时,为什么没有replace数组的方法?
生命平衡,

Answers:


464
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
}

9
只是想我给的ES6版本containsvar contains = (a, b) => !!~a.indexOf(b):P
弗洛里

1
@geon您能解释一下缺点吗?
卡尔·泰勒

1
@KarlTaylor这不是很惯用。如果可以使用ES2017,请Array.prototype.includes改用。
geon

1
可以将IndexOf与对象元素一起使用?
ValRob

2
@ValRob否,但是您可以in用来查看对象是否具有键(例如'property' in obj),或者也可以使用来遍历对象的值Object.values(obj).forEach(value => {})
伊莱(Eli)

95

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; });

7
对于其他任何人,请阅读本文。map()和forEach()都是Javascript规范的更新,在某些旧版浏览器中不存在。如果你想使用它们,你可能需要添加兼容的代码对旧版浏览器:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
jfriend00

2
Array.indexOf()map()和同时引入forEach()。如果您正在支持IE8或更早版本,并且没有使用垫片来增加支持,最好使用mellamokb的答案
gilly3

array.map还返回其第二个参数中的索引a = a.map(function(item,key){if(item == 3452)a [key] = 1010;});
里奇·夏尔马



23

轻松完成for循环。

for (var i = 0; i < items.length; i++)
    if (items[i] == 3452)
        items[i] = 1010;

9
轻松但不一定有效;)
Eli

7
@Eli:尚不清楚OP是否要替换一个或多个实例。我的解决方案处理多个实例。
mellamokb

@Eli如果有的话,这将是取代所有
事故

14

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

例如 :

items[0] = 5;
items[5] = 100;

11

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

const index = items.findIndex(x => x === 3452)
items[index] = 1010

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

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

items[index].lastName = 'Utah'
items[index].firstName = 'Johnny'

6

替换可以一行完成:

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);

或创建一个函数以重用:

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);


6

ES6方式:

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

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

const newItems = items.map(item => item === 3452 ? 1010 : item);

当然,这个问题已经存在很多年了,现在我只喜欢使用不可变的解决方案,对于,它确实很棒ReactJS

对于频繁使用,我提供以下功能:

const itemReplacer = (array, oldItem, newItem) =>
  array.map(item => item === oldItem ? newItem : item);

4

第一种方法

只需一行即可替换或更新数组项的最佳方法

array.splice(array.indexOf(valueToReplace), 1, newValue)

例如:

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

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

console.log(replacedItem) //['RUBY']
console.log(items) //['JS', 'PHP', 'PYTHON']

第二种方法

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

items[items.indexOf(oldValue)] = newValue

3

最简单的方法是使用一些库,例如underscorejs和map方法。

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

_.map(items, function(num) {
  return (num == 3452) ? 1010 : num; 
});
=> [523, 1010, 334, 31, ...5346]

2
有点希望lodash /下划线replace现在提供了阵列感知的功能……_.replace([1, 2, 3], 2, 3);
Droogans 2014年

3

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

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

const nextArr = [
  ...arr.slice(0, arr.indexOf(item)), 
  'second',
  ...arr.slice(arr.indexOf(item) + 1)
]

验证是否有效

console.log(arr)     // [ 'fir', 'next', 'third' ]
console.log(nextArr) // ['fir', 'second', 'third']

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

如果您知道该值,请使用,

items[items.indexOf(334)] = 1010;

如果您想知道该值是否存在,请使用,

var point = items.indexOf(334);

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

如果您知道该地点(位置),则直接使用,

items[--position] = 1010;

如果您要替换几个元素,并且您只知道起始位置就意味着,

items.splice(2, 1, 1010, 1220);

有关.splice的更多信息


1
var index = Array.indexOf(Array value);
        if (index > -1) {
          Array.splice(index, 1);
        }

从这里您可以从数组中删除特定值,并基于相同的索引可以在array中插入值。

 Array.splice(index, 0, Array value);

1

好吧,如果有人在考虑如何从数组的索引中替换对象,这是一个解决方案。

通过其ID查找对象的索引:

const index = items.map(item => item.id).indexOf(objectId)

使用Object.assign()方法替换对象:

Object.assign(items[index], newValue)

1

@ gilly3的回答很棒。

如何将其扩展为对象数组

当我从服务器获取数据时,我更喜欢采用以下方法将新的更新记录更新到我的记录数组中。它使订单完整无缺,并且非常直接。

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

var users = [
{id: 1, firstname: 'John', lastname: 'Sena'},
{id: 2, firstname: 'Serena', lastname: 'Wilham'},
{id: 3, firstname: 'William', lastname: 'Cook'}
];

var editedUser = {id: 2, firstname: 'Big Serena', lastname: 'William'};

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

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


0

首先,像这样重写数组:

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

接下来,通过其索引号访问数组中的元素。确定索引号的公式为:n-1

要替换(n=1)数组中的第一项,请输入:

items[0] = Enter Your New Number;

在您的示例中,数字3452位于第二位置(n=2)。因此确定索引号的公式是2-1 = 1。因此,编写以下代码以替换34521010

items[1] = 1010;

0

这是可重用函数的基本答案:

function arrayFindReplace(array, findValue, replaceValue){
    while(array.indexOf(findValue) !== -1){
        let index = array.indexOf(findValue);
        array[index] = replaceValue;
    }
}

1
让索引 while((index = indexOf(findValue))!== -1)避免出现double indexOf(findValue)
Juan R

0

我使用for循环并遍历原始数组并将匹配区域的位置添加到另一个数组中,然后遍历该数组并在原始数组中对其进行更改,然后返回它,从而解决了这个问题,我使用了arrow函数,但是使用了常规函数也会工作。

var replace = (arr, replaceThis, WithThis) => {
    if (!Array.isArray(arr)) throw new RangeError("Error");
    var itemSpots = [];
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == replaceThis) itemSpots.push(i);
    }

    for (var i = 0; i < itemSpots.length; i++) {
        arr[itemSpots[i]] = WithThis;
    }

    return arr;
};

0
presentPrompt(id,productqty) {
    let alert = this.forgotCtrl.create({
      title: 'Test',
      inputs: [
        {
          name: 'pickqty',
          placeholder: 'pick quantity'
        },
        {
          name: 'state',
          value: 'verified',
          disabled:true,
          placeholder: 'state',

        }
      ],
      buttons: [
        {
          text: 'Ok',
          role: 'cancel',
          handler: data => {

            console.log('dataaaaname',data.pickqty);
            console.log('dataaaapwd',data.state);


          for (var i = 0; i < this.cottonLists.length; i++){

            if (this.cottonLists[i].id == id){
                this.cottonLists[i].real_stock = data.pickqty;

            }
          }

          for (var i = 0; i < this.cottonLists.length; i++){

            if (this.cottonLists[i].id == id){
              this.cottonLists[i].state = 'verified';   

          }
        }
            //Log object to console again.
            console.log("After update: ", this.cottonLists)
            console.log('Ok clicked');
          }
        },

      ]
    });
    alert.present();
  }

As per your requirement you can change fields and array names.
thats all. Enjoy your coding.

0

最简单的方法是这样。

var items = Array(523,3452,334,31, 5346);
var replaceWhat = 3452, replaceWith = 1010;
if ( ( i = items.indexOf(replaceWhat) ) >=0 ) items.splice(i, 1, replaceWith);

console.log(items);
>>> (5) [523, 1010, 334, 31, 5346]

不适用于索引为0的项目 replaceWhat = 523, replaceWith = 999999不会产生正确的结果
Anthony Chung,

0

这是一个班轮。假定该项将在数组中。

var items = [523, 3452, 334, 31, 5346]
var replace = (arr, oldVal, newVal) => (arr[arr.indexOf(oldVal)] = newVal, arr)
console.log(replace(items, 3452, 1010))


0

如果您想要简单的制糖sintax oneliner,则可以:

(elements = elements.filter(element => element.id !== updatedElement.id)).push(updatedElement);

喜欢:

let elements = [ { id: 1, name: 'element one' }, { id: 2, name: 'element two'} ];
const updatedElement = { id: 1, name: 'updated element one' };

如果您没有ID,则可以将元素字符串化为:

(elements = elements.filter(element => JSON.stringify(element) !== JSON.stringify(updatedElement))).push(updatedElement);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.