Làm cách nào để thay thế một mục trong một mảng bằng Javascript?


315

Mỗi mục của mảng này là một số.

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

Làm thế nào để tôi thay thế một số trong mảng bằng một số mới?

Ví dụ: chúng tôi muốn thay thế 3452 bằng 1010, chúng tôi sẽ làm điều này như thế nào?


5
Có nhiều trường hợp của 3452 cần phải thay đổi, hoặc chỉ một trường hợp không?
mellamokb

53
Sẽ có một ví dụ, nếu các thế lực đen tối sẽ không thêm một trường hợp nào nữa.
James

2
Khi có chuỗi thay thế, tại sao không có replacephương thức cho Mảng?
tuổi thọ

Câu trả lời:


464
var index = items.indexOf(3452);

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

Ngoài ra, bạn không nên sử dụng phương thức constructor để khởi tạo mảng của mình. Thay vào đó, hãy sử dụng cú pháp theo nghĩa đen:

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

Bạn cũng có thể sử dụng ~toán tử nếu bạn đang sử dụng JavaScript ngắn gọn và muốn rút ngắn -1so sánh:

var index = items.indexOf(3452);

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

Đôi khi tôi thậm chí thích viết một containshàm để trừu tượng kiểm tra này và giúp dễ hiểu hơn những gì đang diễn ra. Điều tuyệt vời là điều này hoạt động trên mảng và chuỗi cả:

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

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

Bắt đầu với ES6 / ES2015 cho các chuỗi và được đề xuất cho ES2016 cho các mảng, bạn có thể dễ dàng xác định hơn nếu một nguồn có chứa giá trị khác:

if (haystack.includes(needle)) {
    // do your thing
}

9
Chỉ cần nghĩ rằng tôi muốn đưa ra một phiên bản ES6 của contains: var contains = (a, b) => !!~a.indexOf(b): P
Florrie

1
@geon bạn có thể vui lòng giải thích những nhược điểm?
Karl Taylor

1
@KarlTaylor Chỉ là không thành ngữ lắm. Nếu bạn có thể sử dụng ES2017, hãy sử dụng Array.prototype.includesthay thế.
geon

1
Tôi có thể sử dụng IndexOf với các thành phần đối tượng không?
ValRob

2
@ValRob không, nhưng bạn có thể sử dụng inđể xem liệu một đối tượng có khóa (ví dụ 'property' in obj:) hoặc bạn cũng có thể lặp qua các giá trị của đối tượng với Object.values(obj).forEach(value => {}).
Eli

95

Các Array.indexOf()phương pháp sẽ thay thế các trường hợp đầu tiên. Để có được mọi trường hợp sử dụng Array.map():

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

Tất nhiên, điều đó tạo ra một mảng mới. Nếu bạn muốn làm điều đó tại chỗ, sử dụng Array.forEach():

a.forEach(function(item, i) { if (item == 3452) a[i] = 1010; });

7
Đối với bất cứ ai khác đọc điều này. Cả map () và forEach () đều là những bổ sung mới hơn cho thông số Javascript và không có trong một số trình duyệt cũ hơn. Nếu bạn muốn sử dụng chúng, bạn có thể phải thêm mã tương thích cho các trình duyệt cũ hơn: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/
tựa

2
Array.indexOf()được giới thiệu cùng lúc với map()forEach(). Nếu bạn đang hỗ trợ IE8 hoặc sớm hơn và bạn không sử dụng shim để thêm hỗ trợ, tốt hơn hết là đi với câu trả lời của mellamokb .
gilly3

mảng.map cũng trả về chỉ mục trong tham số thứ hai của chúng a = a.map (function (item, key) {if (item == 3452) a [key] = 1010;});
Ricky sharma

38

Giải pháp đề xuất của tôi sẽ là:

items.splice(1, 1, 1010);

Hoạt động mối nối sẽ loại bỏ 1 mục, bắt đầu từ vị trí 1 trong mảng (nghĩa là 3452) và sẽ thay thế nó bằng mục mới 1010.


6
Điều này là sai lệch khi bạn cho rằng tham số đầu tiên có nghĩa là 1mục đó sẽ bị xóa khi trên thực tế tham số đầu tiên có nghĩa là hoạt động diễn ra tại chỉ mục 1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/,
InsOp

28

Sử dụng indexOf để tìm một phần tử.

var i = items.indexOf(3452);
items[i] = 1010;

1
Điều gì nếu nó không mong đợi yếu tố. nếu tìm thấy nó sẽ trả về chỉ mục của phần tử tìm thấy nhưng nếu không nó sẽ trả về -1. và nó sẽ đặt giá trị đó thành -1. vui lòng tham khảo jsbin.com/wugatuwora/edit?js,console
nơi trú ẩn của Surekha

23

Dễ dàng thực hiện với một forvòng lặp.

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

9
Dễ dàng, nhưng không nhất thiết phải hiệu quả;)
Eli

7
@Eli: OP không rõ nếu họ thay thế một thể hiện hoặc nhiều trường hợp. Giải pháp của tôi xử lý nhiều trường hợp.
mellamokb

@Eli Nếu có bất cứ điều gì, đây sẽ là câu trả lời hiệu quả nhất được đăng để thay thế tất cả các lần xuất hiện
Tobiq

15

Bạn có thể chỉnh sửa bất kỳ số lượng của danh sách bằng cách sử dụng chỉ mục

ví dụ :

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

11

Nếu sử dụng một đối tượng phức tạp (hoặc thậm chí là một đối tượng đơn giản) và bạn có thể sử dụng es6, thì đó Array.prototype.findIndexlà một đối tượng tốt. Đối với mảng của OP, họ có thể làm,

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

Đối với các đối tượng phức tạp hơn, điều này thực sự tỏa sáng. Ví dụ,

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

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

6

Thay thế có thể được thực hiện trong một dòng:

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

Hoặc tạo một chức năng để sử dụng lại:

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

Cách ES6 :

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

Chúng tôi muốn thay thế 3452bằng 1010, giải pháp:

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

Chắc chắn, câu hỏi là từ nhiều năm trước và bây giờ tôi chỉ thích sử dụng giải pháp bất biến , chắc chắn, nó là tuyệt vời cho ReactJS.

Để sử dụng thường xuyên, tôi cung cấp chức năng dưới đây:

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

4

Phương pháp đầu tiên

Cách tốt nhất chỉ trong một dòng để thay thế hoặc cập nhật mục của mảng

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

Ví dụ:

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

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

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

Phương pháp thứ hai

Một cách đơn giản khác để thực hiện thao tác tương tự là:

items[items.indexOf(oldValue)] = newValue

3

Cách dễ nhất là sử dụng một số thư viện như dấu gạch dưới và phương thức bản đồ.

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

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

2
Loại điều ước lodash / gạch dưới cung cấp một nhận thức mảng replacengay bây giờ ..._.replace([1, 2, 3], 2, 3);
Dropogans

3

Cách bất biến để thay thế phần tử trong danh sách bằng .slicephương thức và toán tử trải ES6 .

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

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

Xác minh rằng hoạt động

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

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

Nếu bạn biết giá trị thì hãy sử dụng,

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

Nếu bạn muốn biết giá trị đó có mặt hay không, thì hãy sử dụng,

var point = items.indexOf(334);

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

Nếu bạn biết địa điểm (vị trí) thì trực tiếp sử dụng,

items[--position] = 1010;

Nếu bạn muốn thay thế một vài yếu tố và bạn chỉ biết vị trí bắt đầu chỉ có nghĩa là,

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

để biết thêm về .splice


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

từ đây bạn có thể xóa một giá trị cụ thể khỏi mảng và dựa trên cùng một chỉ mục bạn có thể chèn giá trị trong mảng.

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

1

Chà, nếu có ai đó can thiệp vào cách thay thế một đối tượng từ chỉ mục của nó trong một mảng, thì đây là một giải pháp.

Tìm chỉ mục của đối tượng theo id của nó:

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

Thay thế đối tượng bằng phương thức Object.assign ():

Object.assign(items[index], newValue)

1

Trả lời từ @ gilly3 là tuyệt vời.

Làm thế nào để mở rộng điều này cho mảng các đối tượng

Tôi thích cách sau đây để cập nhật bản ghi cập nhật mới vào mảng bản ghi của tôi khi tôi nhận được dữ liệu từ máy chủ. Nó giữ trật tự nguyên vẹn và khá thẳng về phía trước một lớp lót.

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

Đầu tiên, viết lại mảng của bạn như thế này:

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

Tiếp theo, truy cập phần tử trong mảng thông qua số chỉ mục của nó. Công thức để xác định số chỉ mục là:n-1

Để thay thế mục đầu tiên (n=1)trong mảng, hãy viết:

items[0] = Enter Your New Number;

Trong ví dụ của bạn, số 3452ở vị trí thứ hai (n=2). Vậy công thức để xác định số chỉ số là 2-1 = 1. Vì vậy, viết mã sau đây để thay thế 3452bằng 1010:

items[1] = 1010;

0

Đây là câu trả lời cơ bản được thực hiện thành một chức năng có thể sử dụng lại:

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

1
để chỉ số; while ((index = indexOf (findValue))! == -1) để tránh gấp đôi indexOf (findValue)
Juan R

0

Tôi đã giải quyết vấn đề này bằng cách sử dụng các vòng lặp và lặp qua mảng ban đầu và thêm các vị trí của arreas phù hợp vào một mảng khác và sau đó lặp qua mảng đó và thay đổi nó trong mảng ban đầu, sau đó trả về nó, tôi đã sử dụng và hàm mũi tên nhưng là một hàm thông thường cũng sẽ làm việc

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

Cách dễ nhất là đây.

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]

không hoạt động đối với các mục được tìm thấy ở chỉ số 0 replaceWhat = 523, replaceWith = 999999không mang lại kết quả chính xác
Anthony Chung

0

Đây là một lót. Nó giả định mục sẽ nằm trong mảng.

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

Nếu bạn muốn một oneliner đường đơn giản, bạn có thể chỉ cần:

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

Giống:

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

Nếu bạn không có id, bạn có thể xâu chuỗi thành phần như:

(elements = elements.filter(element => JSON.stringify(element) !== JSON.stringify(updatedElement))).push(updatedElement);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.