JavaScript 또는 jQuery를 사용하여 배열 내에있는 객체의 값을 변경하는 방법은 무엇입니까?


206

아래 코드는 jQuery UI 자동 완성에서 비롯된 것입니다.

var projects = [
    {
        value: "jquery",
        label: "jQuery",
        desc: "the write less, do more, JavaScript library",
        icon: "jquery_32x32.png"
    },
    {
        value: "jquery-ui",
        label: "jQuery UI",
        desc: "the official user interface library for jQuery",
        icon: "jqueryui_32x32.png"
    },
    {
        value: "sizzlejs",
        label: "Sizzle JS",
        desc: "a pure-JavaScript CSS selector engine",
        icon: "sizzlejs_32x32.png"
    }
];

예를 들어 jquery-uidesc 값 을 변경하고 싶습니다 . 어떻게해야합니까?

또한 데이터를 더 빨리 얻는 방법이 있습니까? 배열 내부의 객체와 마찬가지로 데이터에 데이터를 가져올 이름을 객체에 부여합니까? 그래서 그것은 같은 것입니다jquery-ui.jquery-ui.desc = ....


구문을 사용하려면 배열을 Javascript 객체로 변환해야합니다 projects["jquery-ui"].desc. 더 좋은 구문을 얻기 위해 노력할 가치가 있습니까?
Frédéric Hamidi

최신 질문으로 솔루션을 업데이트했습니다. 그리고 "projects.jquery-ui.desc"표기법을 사용할 수 있습니다.
애스턴

답변:


135

배열에서 다음과 같이 검색해야합니다.

function changeDesc( value, desc ) {
   for (var i in projects) {
     if (projects[i].value == value) {
        projects[i].desc = desc;
        break; //Stop this loop, we found it!
     }
   }
}

그리고 그것을 사용하십시오

var projects = [ ... ];
changeDesc ( 'jquery-ui', 'new description' );

최신 정보:

더 빨리 얻으려면 :

var projects = {
   jqueryUi : {
      value:  'lol1',
      desc:   'lol2'
   }
};

projects.jqueryUi.desc = 'new string';

Frédéric의 의견에 따르면 객체 키에 하이픈을 사용하거나 "jquery-ui"및 projects [ "jquery-ui"] 표기법을 사용해야합니다.


데이터를 얻는 더 빠른 방법이 있습니까? 객체에 데이터를 가져올 이름을 지정하는 것을 의미합니다. 배열 내부의 객체와 마찬가지로 jquery-ui.jquery-ui.desc = ....
qinHaiXiang

2
-개체 이름 의 하이픈 으로 인해 업데이트가 작동하지 않습니다 . 당신은 작성해야 "jquery-ui": {}하고 projects["jquery-ui"].desc각각.
프레데릭 하 미디

고마워요, 몰랐어요
애스턴

abe kur의 답을보십시오. 맞습니다. 이것과 다른 것들이 길었습니다
stackdave

237

아주 간단합니다

  • findIndex방법을 사용하여 객체의 색인을 찾으십시오 .
  • 인덱스를 변수에 저장하십시오.
  • 다음과 같이 간단한 업데이트를 수행하십시오. yourArray[indexThatyouFind]

//Initailize array of objects.
let myArray = [
  {id: 0, name: "Jhon"},
  {id: 1, name: "Sara"},
  {id: 2, name: "Domnic"},
  {id: 3, name: "Bravo"}
],
    
//Find index of specific object using findIndex method.    
objIndex = myArray.findIndex((obj => obj.id == 1));

//Log object to Console.
console.log("Before update: ", myArray[objIndex])

//Update object's name property.
myArray[objIndex].name = "Laila"

//Log object to console again.
console.log("After update: ", myArray[objIndex])


2
()findIndex방법 에 대한 이중 이유는 무엇입니까?
Terkhos

3
myArray를 변경합니다.
Bimal Grg

1
네,하지만 당신이 돌연변이하고 싶지 않다면. [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], myArray.slice(objIndex + 1))]
Umair Ahmed

1
@UmairAhmed 위 코드를 사용하면 안 [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], ...myArray.slice(objIndex + 1))]됩니까? 나는 두 번째 타원이 빠져 있다고 생각합니다.
Craig

1
이것이 얼마나 깨끗한 지 사랑하십시오!
tdelam

58

원본 데이터 를 변경 하지 않고 ES6 방식 .

var projects = [
{
    value: "jquery",
    label: "jQuery",
    desc: "the write less, do more, JavaScript library",
    icon: "jquery_32x32.png"
},
{
    value: "jquery-ui",
    label: "jQuery UI",
    desc: "the official user interface library for jQuery",
    icon: "jqueryui_32x32.png"
}];

//find the index of object from array that you want to update
const objIndex = projects.findIndex(obj => obj.value === 'jquery-ui');

// make new object of updated object.   
const updatedObj = { ...projects[objIndex], desc: 'updated desc value'};

// make final new array of objects by combining updated object.
const updatedProjects = [
  ...projects.slice(0, objIndex),
  updatedObj,
  ...projects.slice(objIndex + 1),
];

console.log("original data=", projects);
console.log("updated data=", updatedProjects);

57

ES6 덕분에 최고의 솔루션.

"jquery-ui"와 같은 값을 포함하는 객체에 대한 설명이 교체 된 새 배열을 반환합니다.

const newProjects = projects.map(p =>
  p.value === 'jquery-ui'
    ? { ...p, desc: 'new description' }
    : p
);

1
실제로 최고의 실제 솔루션! 감사.
Frederiko Cesar

1
@FrederikoCesar 모든 경우에, 어레이 슬라이스보다 각 오브젝트 비용을 반복하는 확산 연산자를 사용하여 새로운 객체를 삽입하지
마 제드 모하메드

즉시 값을 변경하려면 어떻게해야합니까? 다른 var를 만들지 않고? 가장 좋은 방법은 색인 방법입니다. const targetIndex = summerFruits.findIndex (f => f.id === 3);
Thanasis

37

당신이 사용할 수있는 $ .each ()를 배열을 반복하고 관심있는 개체를 찾습니다 :

$.each(projects, function() {
    if (this.value == "jquery-ui") {
        this.desc = "Your new description";
    }
});

36

추가 라이브러리를 사용하지 않고 맵을 사용하는 것이 가장 좋은 솔루션입니다 (ES6 사용).

const state = [
{
    userId: 1,
    id: 100,
    title: "delectus aut autem",
    completed: false
},
{
    userId: 1,
    id: 101,
    title: "quis ut nam facilis et officia qui",
    completed: false
},
{
    userId: 1,
    id: 102,
    title: "fugiat veniam minus",
    completed: false
},
{
    userId: 1,
    id: 103,
    title: "et porro tempora",
    completed: true
}]

const newState = state.map(obj =>
    obj.id === "101" ? { ...obj, completed: true } : obj
);

19

밑줄 / lodash 라이브러리를 사용하면 쉽게 수행 할 수 있습니다.

  _.chain(projects)
   .find({value:"jquery-ui"})
   .merge({desc: "new desc"});

문서 :
https://lodash.com/docs#find
https://lodash.com/docs#merge


find 함수가 'jquery-ui'를 찾지 못하면 어떻게됩니까?
Mika

부동산의 '찾기'유형에 'LoDashExplicitArrayWrapper'이 (가) 없습니다
AndrewBenjamin

이러한 시퀀스의 결과는 _ # value로 랩핑 해제되어야합니다. lodash.com/docs/4.17.4#chain .value()
p0k8_

17

예제에서 .find를 사용할 수 있습니다.

   var projects = [
            {
                value: "jquery",
                label: "jQuery",
                desc: "the write less, do more, JavaScript library",
                icon: "jquery_32x32.png"
            },
            {
                value: "jquery-ui",
                label: "jQuery UI",
                desc: "the official user interface library for jQuery",
                icon: "jqueryui_32x32.png"
            },
            {
                value: "sizzlejs",
                label: "Sizzle JS",
                desc: "a pure-JavaScript CSS selector engine",
                icon: "sizzlejs_32x32.png"
            }
        ];

let project = projects.find((p) => {
    return p.value === 'jquery-ui';
});

project.desc = 'your value'

놀랄 만한! +1
Mike Musni

12

변경하려는 객체의 색인을 알아야합니다. 그런 다음 아주 간단합니다

projects[1].desc= "new string";

8

이 방법이 더 낫다고 생각합니다

const index = projects.findIndex(project => project.value==='jquery-ui');
projects[index].desc = "updated desc";

귀하 findIndex의 비교 대신 값을 할당합니다
avalanche1

7

다음과 같은 데이터 제공, 우리는 대체 할 열매를summerFruits와 목록 수박 .

const summerFruits = [
{id:1,name:'apple'}, 
{id:2, name:'orange'}, 
{id:3, name: 'berries'}];

const fruit = {id:3, name: 'watermelon'};

두 가지 방법으로이 작업을 수행 할 수 있습니다.

첫 번째 접근법 :

//create a copy of summer fruits.
const summerFruitsCopy = [...summerFruits];

//find index of item to be replaced
const targetIndex = summerFruits.findIndex(f=>f.id===3); 

//replace the object with a new one.
summerFruitsCopy[targetIndex] = fruit;

두 번째 방법 : 사용 mapspread:

const summerFruitsCopy = summerFruits.map(fruitItem => 
fruitItem .id === fruit.id ? 
    {...summerFruits, ...fruit} : fruitItem );

summerFruitsCopy list는 이제 업데이트 된 객체가있는 배열을 반환합니다.


첫 번째 방법이 가장 좋습니다. 다른 var로 옮길 필요가 없습니다. 즉석에서. 귀하의 솔루션에 투표했습니다.
Thanasis

4

// using higher-order functions to avoiding mutation
var projects = [
            {
                value: "jquery",
                label: "jQuery",
                desc: "the write less, do more, JavaScript library",
                icon: "jquery_32x32.png"
            },
            {
                value: "jquery-ui",
                label: "jQuery UI",
                desc: "the official user interface library for jQuery",
                icon: "jqueryui_32x32.png"
            },
            {
                value: "sizzlejs",
                label: "Sizzle JS",
                desc: "a pure-JavaScript CSS selector engine",
                icon: "sizzlejs_32x32.png"
            }
        ];

// using higher-order functions to avoiding mutation
index = projects.findIndex(x => x.value === 'jquery-ui');
[... projects.slice(0,index), {'x': 'xxxx'}, ...projects.slice(index + 1, projects.length)];


이것은 ...프로젝트가 필요하기 전에?
lazzy_ms

@lazzy_ms는 ...스프레드 연산자로 알려져 있습니다. 구글 그것 :)
rmcsharry

4

이것은 또 다른 대답입니다 find. 이것은 다음과 같은 사실에 의존합니다 find.

  • 일치하는 것을 찾을 때까지 배열의 모든 객체를 반복합니다.
  • 각 개체는 귀하에게 제공되며 수정 가능합니다

중요한 자바 스크립트 스 니펫은 다음과 같습니다.

projects.find( function (p) {
    if (p.value !== 'jquery-ui') return false;
    p.desc = 'your value';
    return true;
} );

동일한 자바 스크립트의 대체 버전은 다음과 같습니다.

projects.find( function (p) {
    if (p.value === 'jquery-ui') {
        p.desc = 'your value';
        return true;
    }
    return false;
} );

더 짧고 약간 더 악한 버전이 있습니다.

projects.find( p => p.value === 'jquery-ui' && ( p.desc = 'your value', true ) );

정식 버전은 다음과 같습니다.

  var projects = [
            {
                value: "jquery",
                label: "jQuery",
                desc: "the write less, do more, JavaScript library",
                icon: "jquery_32x32.png"
            },
            {
                value: "jquery-ui",
                label: "jQuery UI",
                desc: "the official user interface library for jQuery",
                icon: "jqueryui_32x32.png"
            },
            {
                value: "sizzlejs",
                label: "Sizzle JS",
                desc: "a pure-JavaScript CSS selector engine",
                icon: "sizzlejs_32x32.png"
            }
        ];

projects.find( p => p.value === 'jquery-ui' && ( p.desc = 'your value', true ) );

console.log( JSON.stringify( projects, undefined, 2 ) );


3

지도 기능을 사용할 수 있습니다-

const answers = this.state.answers.map(answer => {
  if(answer.id === id) return { id: id, value: e.target.value }
  return answer
})

this.setState({ answers: answers })

0

이 코드를 사용해보십시오. jQuery grep 함수를 사용합니다.

array = $.grep(array, function (a) {
    if (a.Id == id) {
        a.Value= newValue;
    }
    return a;
});

0

Array의 map 함수를 사용하여 Javascript를 사용하여 배열의 객체를 수정할 수도 있습니다.

function changeDesc(value, desc){
   projects.map((project) => project.value == value ? project.desc = desc : null)
}

changeDesc('jquery', 'new description')

이 [업데이트 된 값, null를 널 (null), 오브젝트]를 반환합니다
페르난도 Caride

0

먼저 색인을 찾으십시오.

function getIndex(array, key, value) {
        var found = false;
        var i = 0;
        while (i<array.length && !found) {
          if (array[i][key]==value) {
            found = true;
            return i;
          }
          i++;
        }
      }

그때:

console.log(getIndex($scope.rides, "_id", id));

그런 다음이 색인으로 원하는 것을 수행하십시오.

$ scope [returnedindex] .someKey = "someValue";

참고 : for는 모든 배열 문서를 검사하고 스토퍼를 사용하는 동안 사용하므로 코드가 발견되면 중지되므로 사용하지 마십시오.


0

여기에서 각도 js를 사용하고 있습니다. 자바 스크립트에서는 for 루프를 사용하여 찾을 수 있습니다.

    if($scope.bechval>0 &&$scope.bechval!=undefined)
    {

                angular.forEach($scope.model.benhmarkghamlest, function (val, key) {
                $scope.model.benhmarkghamlest[key].bechval = $scope.bechval;

            });
    }
    else {
        alert("Please sepecify Bechmark value");
    }

0

forEach(item,index)도우미를 사용해보십시오

var projects = [
    {
        value: "jquery",
        label: "jQuery",
        desc: "the write less, do more, JavaScript library",
        icon: "jquery_32x32.png"
    },
    {
        value: "jquery-ui",
        label: "jQuery UI",
        desc: "the official user interface library for jQuery",
        icon: "jqueryui_32x32.png"
    },
    {
        value: "sizzlejs",
        label: "Sizzle JS",
        desc: "a pure-JavaScript CSS selector engine",
        icon: "sizzlejs_32x32.png"
    }
];

let search_to_change = 'jquery'

projects.forEach((item,index)=>{
   if(item.value == search_to_change )
      projects[index].desc = 'your description ' 
})

-1

일치하는 항목으로 여러 항목을 업데이트하려면 다음을 사용하십시오.

_.chain(projects).map(item => {
      item.desc = item.value === "jquery-ui" ? "new desc" : item.desc;
      return item;
    })

-1

이것이 문제에 대한 나의 반응입니다. 내 밑줄 버전은 1.7이므로 사용할 수 없습니다 .findIndex.

그래서 수동으로 항목 색인을 가져 와서 교체했습니다. 다음은 동일한 코드입니다.

 var students = [ 
{id:1,fName:"Ajay", lName:"Singh", age:20, sex:"M" },
{id:2,fName:"Raj", lName:"Sharma", age:21, sex:"M" },
{id:3,fName:"Amar", lName:"Verma", age:22, sex:"M" },
{id:4,fName:"Shiv", lName:"Singh", age:22, sex:"M" }
               ]

아래 방법은 학생을 id:4객체의 더 많은 속성으로 대체 합니다.

function updateStudent(id) {
 var indexOfRequiredStudent = -1;
    _.each(students,function(student,index) {                    
      if(student.id === id) {                        
           indexOfRequiredStudent = index; return;      
      }});
 students[indexOfRequiredStudent] = _.extend(students[indexOfRequiredStudent],{class:"First Year",branch:"CSE"});           

}

밑줄 1.8을 사용하면 메소드가 있으므로 단순화됩니다 _.findIndexOf.


-1

의 가치를 업데이트하자 array[2] = "data"

    for(i=0;i<array.length;i++){
      if(i == 2){
         array[i] = "data";
        }
    }

이것이 답변입니까, 질문입니까?
tabdiukov

2
가장 복잡한 방법으로 해당 배열의 두 번째 항목을 성공적으로 업데이트했습니다.
BlueWater86

-1
let thismoth = moment(new Date()).format('MMMM');
months.sort(function (x, y) { return x == thismoth ? -1 : y == thismoth ? 1 : 0; });

1
답변에 대한 설명을 입력하십시오.
Lajos Arpad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.