Làm cách nào để thay đổi giá trị của đối tượng nằm trong một mảng bằng JavaScript hoặc jQuery?


200

Mã dưới đây đến từ jQuery UI Autocomplete:

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"
    }
];

Ví dụ, tôi muốn thay đổi giá trị desc của jquery-ui . Làm thế nào tôi có thể làm điều đó?

Ngoài ra, có cách nào nhanh hơn để lấy dữ liệu không? Ý tôi là đặt tên cho đối tượng để lấy dữ liệu của nó, giống như đối tượng bên trong một mảng? Vì vậy, nó sẽ là một cái gì đó nhưjquery-ui.jquery-ui.desc = ....


Bạn sẽ phải chuyển đổi mảng thành một đối tượng Javascript để sử dụng cú pháp projects["jquery-ui"].desc. Điều đó sẽ có giá trị nỗ lực chỉ để có được cú pháp đẹp hơn?
Frédéric Hamidi

Tôi đã cập nhật giải pháp của mình với câu hỏi mới nhất của bạn. Và bạn có thể sử dụng ký hiệu "dự án.jquery-ui.desc".
Aston

Câu trả lời:


135

Bạn phải tìm kiếm trong mảng như:

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

và sử dụng nó như

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

CẬP NHẬT:

Để có được nó nhanh hơn:

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

projects.jqueryUi.desc = 'new string';

(Theo nhận xét của Frédéric, bạn không nên sử dụng dấu gạch nối trong khóa đối tượng hoặc bạn nên sử dụng ký hiệu "jquery-ui" và các dự án ["jquery-ui"].)


Có cách nào nhanh hơn để có được dữ liệu? Ý tôi là đặt tên cho đối tượng để lấy dữ liệu của nó. Giống như đối tượng bên trong mảng. Vì vậy, tôi có thể sử dụng theo cách đó: jquery-ui.jquery-ui.desc = ....
qinHaiXiang

2
cập nhật của bạn sẽ không hoạt động vì dấu gạch nối -trong tên đối tượng. Bạn sẽ phải viết "jquery-ui": {}projects["jquery-ui"].desctương ứng.
Frédéric Hamidi

Cảm ơn bạn, tôi đã không biết điều đó.
Aston

Hãy nhìn vào câu trả lời của abe Kur, đúng vậy, điều này và các bà mẹ rất dài
stackdave

230

Nó khá đơn giản

  • Tìm chỉ số của đối tượng bằng findIndexphương thức.
  • Lưu trữ chỉ số trong biến.
  • Thực hiện một cập nhật đơn giản như thế này: 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
Bất kỳ lý do cho các đôi ()trên findIndexphương pháp?
Terkhos

3
nó sẽ biến đổi myArray.
Bimal Grg

1
Có, nhưng nếu bạn không muốn đột biến. [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], myArray.slice(objIndex + 1))]
Umair Ahmed

1
@UmairAhmed Mã trên có nên [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], ...myArray.slice(objIndex + 1))]không? Tôi nghĩ rằng bạn thiếu các hình elip thứ hai.
Craig

1
Tình yêu này sạch sẽ làm sao!
tdelam

56

Cách ES6 , mà không làm thay đổi dữ liệu gốc.

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

54

Giải pháp tốt nhất, nhờ ES6.

Điều này trả về một mảng mới với một mô tả được thay thế cho đối tượng có chứa một giá trị bằng "jquery-ui".

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

1
Quả thực là giải pháp thực tế tốt nhất! Cảm ơn.
Frederiko Cesar

1
@FrederikoCesar không phải trong tất cả các trường hợp, việc lặp lại trên mỗi đối tượng có chi phí cao hơn việc cắt mảng và tiêm đối tượng mới bằng toán tử trải rộng
Maged Mohamed

Điều gì nếu bạn muốn thay đổi giá trị trên bay? Nếu không tạo var khác? Cách tốt nhất là phương thức chỉ mục: const target Index = summerFruits.find Index (f => f.id === 3);
Thanocation

37

Bạn có thể sử dụng $ .each () để lặp lại mảng và định vị đối tượng bạn quan tâm:

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

36

Sử dụng bản đồ là giải pháp tốt nhất mà không cần sử dụng các thư viện bổ sung. (Sử dụng 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

Thật dễ dàng có thể được thực hiện với thư viện gạch dưới / lodash:

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

Tài liệu:
https://lodash.com/docs#find
https://lodash.com/docs#merge


Điều gì xảy ra nếu 'jquery-ui' không được tìm thấy bởi hàm find?
Mika

Bất động sản 'tìm' không tồn tại trên loại 'LoDashExplicitArrayWrapper'
AndrewBenjamin

Kết quả của các chuỗi như vậy phải được mở ra với giá trị _ #. lodash.com/docs/4.17.4#chain .value()
p0k8_

17

bạn có thể sử dụng .find để trong ví dụ của bạn

   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'

Kinh ngạc! +1
Mike Musni

12

bạn cần biết chỉ số của đối tượng bạn đang thay đổi. sau đó nó khá đơn giản

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

8

Tôi nghĩ rằng cách này là tốt hơn

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

trong khi findIndexbạn đang gán một giá trị thay vì so sánh
avalanche1

6

đưa ra các dữ liệu sau đây, chúng tôi muốn thay thế các loại quả mọng trong summerFruitsdanh sách bằng dưa hấu .

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

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

Hai cách bạn có thể làm điều này.

Cách tiếp cận đầu tiên:

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

Cách tiếp cận thứ hai: sử dụng mapspread:

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

summerFruitsCopy bây giờ danh sách sẽ trả về một mảng với đối tượng được cập nhật.


Phương pháp đầu tiên là tốt nhất. Không cần phải chuyển sang var khác rồi quay lại. Về phương pháp bay. Tôi đã bình chọn giải pháp của bạn.
Thanocation

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


Điều này ...trước khi các dự án là cần thiết?
lazzy_ms

@lazzy_ms ...được gọi là toán tử lây lan. google nó :)
rmcsharry

4

Đây là một câu trả lời khác liên quan find. Điều này dựa trên thực tế rằng find:

  • lặp qua mọi đối tượng trong mảng UNTIL một kết quả khớp được tìm thấy
  • mỗi đối tượng được cung cấp cho bạn và là MODIFIABLE

Đây là đoạn mã Javascript quan trọng:

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

Đây là phiên bản thay thế của cùng một Javascript:

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

Đây là một phiên bản thậm chí ngắn hơn (và có phần ác hơn):

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

Đây là phiên bản hoạt động đầy đủ:

  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

Bạn có thể sử dụng chức năng bản đồ -

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

Hãy thử mã này. nó sử dụng hàm grep jQuery

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

0

Chúng ta cũng có thể sử dụng chức năng bản đồ của Array để sửa đổi đối tượng của một mảng bằng Javascript.

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

changeDesc('jquery', 'new description')

điều này sẽ trả về [null, đối tượng có giá trị được cập nhật, null]
Fernando Caride

0

Tìm chỉ mục đầu tiên:

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

Sau đó:

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

Sau đó, làm những gì bạn muốn với chỉ số này, như:

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

Lưu ý: vui lòng không sử dụng vì, vì sẽ kiểm tra tất cả các tài liệu mảng, sử dụng trong khi có nút chặn, vì vậy nó sẽ dừng lại khi tìm thấy, do đó mã nhanh hơn.


0

Ở đây tôi đang sử dụng js góc. Trong javascript bạn có thể sử dụng vòng lặp để tìm.

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

-1

để cập nhật nhiều mục với các trận đấu sử dụng:

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

-1

Đây là phản ứng của tôi cho vấn đề. Phiên bản gạch dưới của tôi là 1.7 do đó tôi không thể sử dụng .findIndex.

Vì vậy, tôi tự lấy chỉ số của mặt hàng và thay thế nó. Đây là mã cho cùng.

 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" }
               ]

Phương thức dưới đây sẽ thay thế học sinh id:4bằng nhiều thuộc tính hơn trong đối tượng

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

}

Với gạch dưới 1.8, nó sẽ được đơn giản hóa khi chúng ta có các phương thức _.findIndexOf.


-1

Cho phép bạn muốn cập nhật giá trị của array[2] = "data"

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

Đây là một câu trả lời hay một câu hỏi?
tabdiukov

2
Bạn đã cập nhật thành công mục thứ 2 trong mảng đó theo cách phức tạp nhất có thể.
BlueWater86

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

1
Vui lòng cung cấp một mô tả cho câu trả lời của bạn.
Lajos Arpad
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.