如何在javascript中更新对象数组

时间:2013-07-19 07:55:50

标签: javascript arrays object data-structures

说我有一个变量

 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. 如果数据中的任何对象都没有相同的名称,则
  3. 将参数添加到数据中。
  4. 如何编写此功能?

     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 个答案:

答案 0 :(得分:2)

好的,你可能想做类似的事情吗?

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

由于顺序对您来说并不重要,因此更好的选择是对象哈希而不是数组。像

这样的东西
{
  'a':{name:'a', value: 'aa'}
}

这样您就可以根据键轻松搜索,并且可以更新哈希值。

您甚至可以根据自己的情况采用上述方法。如上所述将数组转换为临时对象哈希,进行必要的更改,然后转换回数组。这样会更有效率,因为它可以节省您在数组中的搜索。

 var output_array = [];
 for (var key in obj) {
   if (obj.hasOwnProperty(key)) {
      output_array.push(obj[key]);
   }
 }

答案 3 :(得分:0)

如果名称是唯一的,您可以将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];
      }
   }

}

编辑:转换为数组的函数

 function toArray() {
    var array=[];
    for (key in data) {
       array.push({name:key,value:data[key]});
    }
    return array;
 }