我有一个数组如下。我想要实现的是一个函数,它将节点的ID,x和y作为输入,并在数组中进行相应的更改。
var nodes = [{ID:"101", x:100, y:200}
,{ID:"102", x:200, y:200}
,{ID:"103", x:300, y:300}
,{ID:"104", x:200, y:300}];
例如,function (102,200,300);
会将数组中第二个对象的x和y更新为{ID:"102", x:200, y:300}
。
我所做的是:
function update(id,x,y){
for (var i=0 in nodes){
if (nodes[i].ID==id){
nodes[i].x = x;
nodes[i].y = y;
break;
}
}
}
除了使用for循环和条件检查和更新之外,我还想知道其他方法。提前谢谢。
答案 0 :(得分:2)
不确定你在这里期待什么。如果你有一个非特定元素的数组,你将最终以这种或那种方式循环,除非对象总是以相同的顺序并且可以通过它们的索引访问。如何生成ID /如何将它们推送到阵列上?
如果你想避免循环,你应该只是将对象存储在一个对象中,并使它们的ID成为键属性。
var nodes = {
'101': {ID: '101', x:100, y:200},
'102': {ID: '102', x:200, y:200},
'103': {ID: '103', x:300, y:300},
'104': {ID: '104', x:200, y:300}
};
然后你可以直接访问它们。
function setv(id, x, y) {
if (nodes.hasOwnProperty(id)) {
nodes[id].x = x;
nodes[id].y = y;
}
}
此外,您应避免在数组上使用for..in
- 使用常规for
循环或Array.prototype.forEach()
。
循环访问对象并检查其属性和值的简单方法:
function logObj(obj) {
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
console.log(p, obj[p]);
}
}
}