3

変数があると言う

 data=[] 

 //this variable is an array of object like 
 data = [
     {name:'a',value:'aa'},
     {name:'b',value:'bb'}
 ]

 // the data structrue can not be changed and the initial value is empty

今すぐデータを更新したい

 function updateData(){
     if(!data.length){
         data.push(arguments)
     }
     else{
         //this parts really confuse me
     }

 }

この関数は任意の数の引数を受け入れる必要があり、データ内のオブジェクトの順序は重要ではありません 。更新ルール:

  1. それらが同じ名前を持つ場合、オブジェクトの値を引数の値に更新します。
  2. データ内のオブジェクトに同じ名前がない場合は、引数をデータに追加します。

この関数の書き方

 updateData([
     {name:'a',value:'aa'},
     {name:'b',value:'bb'}
 ])
 // expect data = [
           {name:'a',value:'aa'},
           {name:'b',value:'bb'}
           ]

 updateData([
     {name:'a',value:'aa'},
     {name:'b',value:'DD'},
     {name:'c',value:'cc'}
] )
 // expect data = [
           {name:'a',value:'aa'},
           {name:'b',value:'DD'},
           {name:'c',value:'cc'}
           ]
4

4 に答える 4

3

わかりました、あなたはそのようなことをしたいかもしれませんか?

var data = [
     {name:'a',value:'aa'},
     {name:'b',value:'bb'}
 ];

 function updateData(obj){
  var objFound_bool = false;
  for (var i = 0; i < data.length; i++) {
    if(obj.name === data[i].name){
      objFound_bool = true;
      data[i].value =obj.value ;
    }
  }
  if(!objFound_bool){
    data.push(obj)
  }
 }
于 2013-07-19T08:07:37.993 に答える
2

Ashutosh Upadhyay が提案したように、配列の代わりに名前と値のペアを使用します。

var data ={};

var updateData=function(){
  var len = arguments.length,
  i=0;
  for(i=0;i<len;i++){
    data[arguments[i].name]=arguments[i].value;
  }
};
updateData(
 {name:"a",value:"22"}, 
 {name:"b",value:"2"}, 
 {name:"c",value:"3"}, 
 {name:"a",value:"1"} // the new value for a
);
for(key in data){
  if(data.hasOwnProperty(key)){
    console.log(key + "=" + data[key]);
  }
}

配列に関するコメントを読んでください。配列が必要な場合は、次のことができます。

var data = [];
function findIndex(name){
  var i = 0;
  for(i=0;i<data.length;i++){
    if(data[i].name===name){
      return i;
    }
  }
  return i;
}
function updateData(){
  var i = 0;
  for(i=0;i<arguments.length;i++){
    data[findIndex(arguments[i].name)]=arguments[i];
  }
}
updateData(
 {name:"a",value:"22"}, 
 {name:"b",value:"2"}, 
 {name:"c",value:"3"}, 
 {name:"a",value:"1"} // the new value for a
);

console.log(data);
于 2013-07-19T08:21:26.690 に答える
1

順序は重要ではないため、配列ではなくオブジェクト ハッシュを選択することをお勧めします。何かのようなもの

{
  'a':{name:'a', value: 'aa'}
}

これにより、キーに基づいて簡単に検索でき、ハッシュを更新できます。

あなたの状況に合わせて上記を採用することもできます。上記のように配列を一時オブジェクト ハッシュに変換し、必要な変更を行って、配列に戻します。これにより、配列全体の検索が節約されるため、より効率的になります。

 var output_array = [];
 for (var key in obj) {
   if (obj.hasOwnProperty(key)) {
      output_array.push(obj[key]);
   }
 }
于 2013-07-19T08:03:23.660 に答える
1

名前が一意の場合はdata、マップとして定義し、名前をキーとして値を追加するだけです:

 var data={
     'a':'aa',
     'b':'bb'
 }

function updateData() {
   for (var i=0;i<arguments.length;i++) { //for each argument...
      for (key in arguments[i]) { //we'll put each pair (key,value) in the data
         data[key]=arguments[i][key];
      }
   }

}

EDIT:配列に変換する関数

 function toArray() {
    var array=[];
    for (key in data) {
       array.push({name:key,value:data[key]});
    }
    return array;
 }
于 2013-07-19T08:03:58.660 に答える