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

}

编辑:转换为数组的函数

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