web-dev-qa-db-ja.com

JavaScriptやjQueryを使って配列の中にあるオブジェクトの値を変更するにはどうすればいいですか?

以下のコードは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"
    }
];

たとえば、jquery-uiのdesc値を変更します。どうやってやるの?

さらに、データを取得するためのより速い方法はありますか?配列内のオブジェクトと同じように、オブジェクトにそのデータを取得するための名前を付けるということですか。だから、それはjquery-ui.jquery-ui.desc = ....のようなものになります

120
qinHaiXiang

次のように配列を検索する必要があります。

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

(フレデリックのコメントによると、オブジェクトキーにハイフンを使用しないでください。または "jquery-ui"とprojects ["jquery-ui"]の表記を使用してください。)

82
Aston

とても簡単です

  • 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])
136
Umair Ahmed

$。each() を使用して配列を反復処理し、目的のオブジェクトを見つけることができます。

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

ES6 way、なしmutating元のデータ.

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);
25
Bimal Grg

それはアンダースコア/ lodashライブラリで簡単に達成できます。

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

ドキュメント:
https://lodash.com/docs#find
https://lodash.com/docs#merge

17
user2765479

ES6のおかげで最善の解決策。

これは、 "jquery-ui"に等しい値を含むオブジェクトの置き換えられた説明を含む新しい配列を返します。

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

変更しているオブジェクトのインデックスを知る必要があります。それからそれはとても簡単です

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

あなたの例ではそう.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'
6
abe kur
// 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)];
3
Leo Lanese

マップ機能を使用できます-

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

this.setState({ answers: answers })
1
gandharv garg

私はこの方法が良いと思います

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

最初にインデックスを見つけます。

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 [返されたインデックス] .someKey = "someValue";

注:forは使用しないでください。forはすべての配列文書をチェックしますので、ストッパーを付けて使用すると、見つかった時点で停止するので、コードが高速になります。

0
Raz

また、Javascriptを使用して配列のオブジェクトを変更するために、Arrayのmap関数を使用することもできます。

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

changeDesc('jquery', 'new description')
0
Mahima Agrawal

ここで私は角度のjsを使っています。 JavaScriptでは、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
Hari Lakkakula

このコードを試してください。 jQueryのgrep関数を使います

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