Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中使用对象数组作为参数_Javascript_Arrays_Object - Fatal编程技术网

在Javascript中使用对象数组作为参数

在Javascript中使用对象数组作为参数,javascript,arrays,object,Javascript,Arrays,Object,我想根据用户参与的活动显示或隐藏各种元素。以前,我的setDisplays函数有一长串参数,每次调用该函数时都需要设置这些参数:例如 set显示(“无”、“内联”、“内联”、“无”、“无”、“无”、“块”、“无”、“无”、“无”、“无”、“表”、“块”、“块”) 除了难以阅读和设置外,它还缺乏灵活性。因此,我更改了函数以获取对象数组:例如 setDisplays([{bingoDisplay:"none"},{bingoScore:"none"},{bingoWords:"none"},{boo

我想根据用户参与的活动显示或隐藏各种元素。以前,我的setDisplays函数有一长串参数,每次调用该函数时都需要设置这些参数:例如

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次,并不能使其成为“一次调用”。但这是没有办法的。很好,您找到了一个有效的解决方案。感谢您的响应。对象对我来说还是很新的,所以简单的解决方案并不总是显而易见的。我几乎使用了数组,因为它似乎可以工作,但我很抱歉我先在这里登记的。