在Javascript中使用对象数组作为参数
我想根据用户参与的活动显示或隐藏各种元素。以前,我的setDisplays函数有一长串参数,每次调用该函数时都需要设置这些参数:例如在Javascript中使用对象数组作为参数,javascript,arrays,object,Javascript,Arrays,Object,我想根据用户参与的活动显示或隐藏各种元素。以前,我的setDisplays函数有一长串参数,每次调用该函数时都需要设置这些参数:例如 set显示(“无”、“内联”、“内联”、“无”、“无”、“无”、“块”、“无”、“无”、“无”、“无”、“表”、“块”、“块”) 除了难以阅读和设置外,它还缺乏灵活性。因此,我更改了函数以获取对象数组:例如 setDisplays([{bingoDisplay:"none"},{bingoScore:"none"},{bingoWords:"none"},{boo
set显示(“无”、“内联”、“内联”、“无”、“无”、“无”、“块”、“无”、“无”、“无”、“无”、“表”、“块”、“块”)代码>
除了难以阅读和设置外,它还缺乏灵活性。因此,我更改了函数以获取对象数组:例如
setDisplays([{bingoDisplay:"none"},{bingoScore:"none"},{bingoWords:"none"},{book_overlay:"none"},{choiceDiv:"none"},{errDiv:"none"},{imageDiv:"block"},{livesDispTop:"none"},{phonDisplay:"none"},{score:"none"},{timer:"none"},{phonUSelect:"none"},{numUSelect:"none"},{vocSelect:"table"}]);
修改后的功能是:
function setDisplays(display) {
var display_name;
var display_setting;
for (var i=0; i<display.length; i++){
display_name=Object.keys(display[i]);
display_setting=display[i][display_name];
document.getElementById(display_name).style.display=display_setting;
}
}
功能设置显示(显示){
变量显示名称;
变量显示设置;
对于(var i=0;i我建议使用object作为参数,而不是数组。示例:
function setDisplays(obj) {
var display_name;
var display_setting;
for (var i in obj){
if (!obj.hasOwnProperty(i)) { continue; }
display_name=i;
display_setting=obj[i];
document.getElementById(display_name).style.display=display_setting;
}
}
setDisplays({bingoDisplay:"none", bingoScore:"none", bingoWords:"none"});
另一个版本的set显示带有Object.keys的
函数
function setDisplays(obj) {
var display_name;
var display_setting;
var keys = Object.keys(obj);
for (var i=0, l=keys.length; i<l; i++){
key = keys[i];
display_name=key;
display_setting=obj[key];
document.getElementById(display_name).style.display=display_setting;
}
}
功能设置显示(obj){
变量显示名称;
变量显示设置;
var keys=Object.keys(obj);
对于(var i=0,l=keys.length;i,使用对象将是一个更简单的解决方案
var setDisplays = {
bingoDisplay: "none",
bingoScore: "none",
bingoWords: "none"
};
然后,您可以通过以下方式访问每个属性(读取或设置):
setDisplays.bingoScore = "something";
setDisplays.bingoScore; //returns "something"
与数组表示法相比,使用对象将更直观,因为您可以直接引用键,而不必跟踪哪个参数位于哪个索引,如果性能是任务的优先级,请看,但我认为性能不应该是一个问题。您是否考虑过h,而不是使用一个属性对象数组保留单个对象,例如{bingoDisplay:“none”,bingoScore:“none”,…}
?单个对象的操作和调试时的检查要简单得多,您也不必每次都传递所有对象,只传递那些应该是非默认值的对象。还可以很容易地为object.keys()获取多边形填充谢谢,它更干净了。我已经看到了很多关于for(obj中的I)的警告。在这个例子中可以使用吗,因为没有proto?我认为可以。请注意,我添加了obj.hasOwnProperty(I)
在一个循环中,这样就不会得到未定义的键。是的,这也应该可以防止for循环迭代原型链中的属性。我已经尝试了您的第一个版本,它工作得很好。尽管如我所述,早期浏览器兼容性对我来说不是问题,没有键的版本看起来更干净,obj.hasOwnProperty(i)
应使for-in循环安全。感谢您的帮助。感谢您的响应。是否可以使用此对象的单个调用设置多个元素的显示?单个调用,否(我不知道)。可以循环它,也可以显式地键入每个属性。现在,数组中存储了10多个对象。它可以工作,但只使用一个对象更简单(用于维护和将来添加)。是的,我明白你的意思。不过,就我而言,@Tim Osadchiy的解决方案更灵活,因为我可以通过一个函数调用设置单个元素的显示,也可以设置多个元素的显示。这是同一个解决方案,我只是没有为你键入整个代码:)调用一个函数,然后调用该对象10次,并不能使其成为“一次调用”。但这是没有办法的。很好,您找到了一个有效的解决方案。感谢您的响应。对象对我来说还是很新的,所以简单的解决方案并不总是显而易见的。我几乎使用了数组,因为它似乎可以工作,但我很抱歉我先在这里登记的。