JavaScript veya jQuery kullanarak bir dizinin içindeki nesnenin değeri nasıl değiştirilir?


206

Aşağıdaki kod jQuery UI Autocomplete'dan geliyor:

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

Örneğin, jquery-ui'nin desc değerini değiştirmek istiyorum . Bunu nasıl yapabilirim?

Ayrıca, verileri almanın daha hızlı bir yolu var mı? Yani nesneyi, bir dizinin içindeki nesne gibi, verilerini almak için bir ad vermek mi? Yani böyle bir şey olurdujquery-ui.jquery-ui.desc = ....


Sözdizimini kullanmak için diziyi bir Javascript nesnesine dönüştürmeniz gerekir projects["jquery-ui"].desc. Bu sadece daha iyi sözdizimi elde etmek için çabaya değer mi?
Frédéric Hamidi

Çözümümü en son sorunuzla güncelledim. Ve "projects.jquery-ui.desc" gösterimini kullanabilirsiniz.
Aston

Yanıtlar:


135

Dizide şöyle arama yapmanız gerekir:

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

ve onu gibi kullan

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

GÜNCELLEME:

Daha hızlı almak için:

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

projects.jqueryUi.desc = 'new string';

(Frédéric'in açıklamasına göre, nesne anahtarında tire kullanmamalısınız veya "jquery-ui" ve projeler ["jquery-ui"] gösterimini kullanmalısınız.)


Verileri almanın çok daha hızlı bir yolu var mı? Ben bu şekilde kullanılır can, nesne array.So içindeki nesne gibi onun data.Just almak için bir isim vermek demek: jquery-ui.jquery-ui.desc = ....
qinHaiXiang

2
-nesne adınızdaki kısa çizgi nedeniyle güncellemeniz çalışmaz . Sen yazmak zorunda kalacak "jquery-ui": {}ve projects["jquery-ui"].descsırasıyla.
Frédéric Hamidi

Teşekkürler, bunu bilmiyordum.
Aston


237

Oldukça basit

  • findIndexYöntemi kullanarak nesnenin dizinini bulun .
  • Dizini değişkende saklayın.
  • Bunun gibi basit bir güncelleme yapın: 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
Çift için bir nedeni var ()üzerinde findIndexyöntemle?
Terkhos

3
myArray'ı değiştirecek.
Bimal Grg

1
Evet, ama mutasyona uğramak istemiyorsanız. [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], myArray.slice(objIndex + 1))]
Umair Ahmed

1
@UmairAhmed Yukarıdaki kod olmamalı [...myArray.slice(0, objIndex), Object.assign({}, myArray[objIndex], ...myArray.slice(objIndex + 1))]mı? Sanırım ikinci elipsleri kaçırıyorsun.
Craig

1
bunun ne kadar temiz olduğunu seviyorum!
tdelam

58

ES6 yolu olmadan mutasyona orijinal verileri.

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 sayesinde en iyi çözüm.

Bu, "jquery-ui" değerine eşit bir değer içeren nesne için değiştirilmiş bir açıklama içeren yeni bir dizi döndürür.

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

1
Gerçekten de en iyi gerçek çözüm! Teşekkürler.
Frederiko Cesar

1
@FrederikoCesar her durumda değil, her bir nesnenin yinelenmesi, diziyi dilimlemekten ve yeni nesneyi forma operatörü kullanarak enjekte etmekten daha pahalı
Maged Mohamed

ya anında değeri değiştirmek isterseniz? Başka bir var mı yaratmadan? En iyi yol dizin yöntemidir: const targetIndex = summerFruits.findIndex (f => f.id === 3);
Thanasis

37

Sen kullanabilirsiniz $ .each () diziyi sürekli tekrarlanması ve size ilgilendiğiniz nesneyi bulun:

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

36

Harita kullanmak, fazladan kitaplık kullanmadan en iyi çözümdür (ES6 kullanarak)

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


17

örneğinizde .find kullanabilirsiniz

   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'

İnanılmaz! +1
Mike Musni

12

değiştirdiğiniz nesnenin dizinini bilmeniz gerekir. o zaman oldukça basit

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

8

Bence bu yol daha iyi

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

senin içinde findIndexbir değer atamak yerine kıyaslıyorsun
avalanche1

7

Aşağıdaki veriler göz önüne alındığında, biz değiştirmek istiyor çilek de summerFruitslistede karpuz .

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

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

Bunu iki şekilde yapabilirsiniz.

İlk yaklaşım:

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

İkinci yaklaşım: kullanma mapve spread:

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

summerFruitsCopy listesi artık güncellenmiş nesneye sahip bir dizi döndürecektir.


İlk yöntem en iyisidir. Başka bir değişkene ve sonra geri gitmeye gerek yok. Anında yöntemi. Çözümüne oy verdim.
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)];


Bu ...projelerin önce gereklidir?
lazzy_ms

@lazzy_ms forma ...operatörü olarak bilinir. google it :)
rmcsharry

4

Bu başka bir cevaptır find. Bu şu gerçeğe dayanır find:

  • eşleşme bulunana kadar dizideki her nesne boyunca yinelenir
  • her nesne size sağlanır ve DEĞİŞTİRİLEBİLİR

İşte kritik Javascript snippet'i:

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

İşte aynı Javascript'in alternatif bir sürümü:

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

İşte daha kısa (ve biraz daha kötü bir sürüm):

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

İşte tam çalışan bir sürüm:

  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

Harita işlevini kullanabilirsiniz -

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

Bu kodu deneyin. jQuery grep işlevini kullanır

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

0

Javascript kullanarak bir dizinin nesnesini değiştirmek için Array'ın map işlevini de kullanabiliriz.

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

changeDesc('jquery', 'new description')

bu [null, güncellenmiş değere sahip nesne, null]
döndürür

0

Önce dizini bulun:

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

Sonra:

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

Sonra bu dizinle istediğinizi yapın, örneğin:

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

Not: için kullanmayın, çünkü tüm dizi belgelerini kontrol edecek, bir tıpa ile kullanırken kullanabilirsiniz, böylece bulunduğunda bir kez durur, böylece daha hızlı kod.


0

Burada açısal js kullanıyorum. Javascript'te döngü bulmak için kullanabilirsiniz.

    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)yardımcı kullanmayı dene

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

eşleşmelerle birden çok öğeyi güncellemek için şunu kullanın:

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

-1

Bu benim soruna cevabım. Benim alt çizgi versiyonu 1,7 dolayısıyla kullanamadı .findIndex.

Bu yüzden elle öğenin indeksini aldım ve değiştirdim. İşte aynı kod.

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

Aşağıdaki yöntem, öğrenciyi id:4nesnede daha fazla özellikle değiştirecektir

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

}

Alt çizgi 1.8 ile yöntemlerimiz basitleştirilecektir _.findIndexOf.


-1

Değerini güncellemek istiyorum array[2] = "data"

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

Bu bir cevap mı yoksa bir soru mu?
tabdiukov

2
Bu dizideki 2. öğeyi mümkün olan en karmaşık şekilde başarıyla güncellediniz.
BlueWater86

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

1
Lütfen cevabınıza bir açıklama girin.
Lajos Arpad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.