说我有一个变量
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
}
}
此函数必须接受任意数量的参数,并且数据中对象的顺序无关紧要 更新规则:
如何编写此功能?
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'}
]
答案 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;
}