배열의 항목을 Javascript로 바꾸는 방법은 무엇입니까?


315

이 배열의 각 항목은 숫자입니다.

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

일부 숫자를 배열로 바꾸려면 어떻게해야합니까?

예를 들어, 3452를 1010으로 바꾸려면 어떻게해야합니까?


5
3452의 여러 인스턴스가 변경되어야합니까, 아니면 하나만 변경해야합니까?
mellamokb

53
어두운 힘이 하나 더 추가하지 않으면 하나의 인스턴스가 있습니다.
제임스

2
문자열 대체 가있을 때 왜 replace배열에 대한 메소드가 없습니까?
lifebalance

답변:


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 버전을 제공한다고 생각했습니다 contains: var contains = (a, b) => !!~a.indexOf(b): P
Florrie

1
@geon 단점을 설명해 주시겠습니까?
Karl Taylor

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 또는 이전 버전을 지원하고 있고 shim을 사용하여 지원을 추가하지 않는 경우 mellamokb의 답변 을 사용하는 것이 좋습니다 .
gilly3

또한 array.map은 두 번째 매개 변수로 인덱스를 반환합니다. a = a.map (function (item, key) {if (item == 3452) a [key] = 1010;});
Ricky sharma

38

내 제안 해결책은 다음과 같습니다.

items.splice(1, 1, 1010);

스플 라이스 작업은 배열의 1 위치부터 시작하여 1 개의 항목을 제거 3452하고 새 항목으로 교체합니다 1010.


6
첫 번째 매개 변수는 1실제로 첫 번째 매개 변수가 작업이 인덱스에서 수행됨을 의미 할 때 항목이 제거됨 을 의미하므로 오해의 소지 가 있습니다 1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
InsOp

28

indexOf를 사용하여 요소를 찾으십시오.

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

1
그것이 요소를 기대하지 않으면 어떻게 될까요? 발견되면 발견 된 요소의 색인을 리턴하지만 그렇지 않으면 -1을 리턴합니다. 해당 값을 -1로 설정합니다. jsbin.com/wugatuwora/edit?js,console을
surekha shelake

23

for루프로 쉽게 달성 할 수 있습니다 .

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

9
쉽고 효율적일 필요는 없습니다.)
Eli

7
@Eli : OP가 하나의 인스턴스 또는 여러 인스턴스를 대체하고 있는지 명확하지 않았습니다. 내 솔루션은 여러 인스턴스를 처리합니다.
mellamokb

@Eli 만약 그렇다면, 이것은 모든 발생을 대체하기 위해 게시 된 가장 효율적인 답변
Tobiq

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

우리는 대체 싶어 3452함께 1010, 솔루션 :

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 / underscore의 종류는 replace지금 배열 인식을 제공했습니다 ..._.replace([1, 2, 3], 2, 3);
Droogans

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.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입니다. 그래서 대체 할 수있는 다음 코드 쓰기 3452로를 1010:

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 루프를 사용하고 원래 배열을 반복하고 일치하는 arreas의 위치를 ​​다른 배열에 추가 한 다음 해당 배열을 반복하고 원래 배열에서 변경 한 다음 반환 하고이 기능을 사용했습니다. 작동합니다.

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.