将对象传递给动态函数的函数

时间:2017-01-27 03:11:10

标签: javascript

您好我需要创建动态函数,所以我使用以下代码。在这里,我想将对象传递给函数并获取它。我尝试传递javascript数组,它的工作原理,但javascript对象无法正常工作。

代码:

 <button onclick="mainfunc('funct')">button</button>
 <script>
  window.funct = function(){
    alert(arguments);                 //alerts object arguments.
    alert(arguments.a);               //alerts undefined
    alert(JSON.stringify(arguments)); //alerts blank object as {}
  }

  window.mainfunc = function(func){
   var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
   window[func].apply(this, args);
  }
 </script>

	window.funct = function(){
		alert(arguments);
		alert(arguments.a);
		alert(JSON.stringify(arguments));
	}

window.mainfunc = function(func){
	var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
	window[func].apply(this, args);
}
<button onclick="mainfunc('funct')">button</button>

更新

我正在研究在线航班预订系统。我想创建动态函数来调用从php循环创建的函数。

 <?php foreach($flightsegment as $data){ $flightnumber = $data->flightnum; ?>
 <li><a href="#fareRules<?= $flightnumber; ?>" data-toggle="tab" onclick="mainfunc('fareRules<?= $flightnumber; ?>', event)">Fare Rules</a></li>
 <script>
jQuery(document).ready(function ($) {

    window.fareRules<?= $flightnumber; ?> = function () {
        //                                                                            alert(arguments[0].target);
        alert(JSON.stringify(arguments));
        var params = {};
        alert(arguments[1]);
        if (arguments[1] > 1) {   //there is multiple segment
            var segment = arguments[1];
            var logical_gap = segment - 1;
            var dataobj = {};
            for (var o = 2; o < arguments.length; o++) {
                alert(arguments[o + 1]);

            }

        } else {    //there is single segment
            for (var i = 1; i < arguments.length; i++) {
                params[i] = arguments[i];
            }
            var target = arguments[0];

            var url = "<?php echo site_url() . '/action/?type=fairbasisrule' ?>";
            var json_upload = "json_name=" + JSON.stringify(params);
            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    var data = JSON.parse(this.responseText);
                    var len = data.length;
                    //                                                                                console.log(data);
                    var html = "";
                    for (var i = 0; i < len; i++) {
                        var rules = data[i].rules[0];
                        html += "<b>" + data[i].title + "</b><br><p>" + rules.replace(/\n/g, '<br/>') + "</p>";
                    }
                    $(target).parents("td").find('#fareRules<?= $flightnumber; ?>').html(html);
                }
            };
            xhttp.open("POST", url, true);
            xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

            xhttp.send(json_upload);
        }
    }
});
</script>

<?php } ?>

 <script>
  window.mainfunc = function (func)
        {
            if ($(arguments[1].target).parents("td").find('.fair_rule_basiscode').length > 1) {
                var vars = {};

                vars['target'] = arguments[1].target;
                vars['segment_length'] = $(arguments[1].target).parents("td").find('.fair_rule_basiscode').length;
                var z = 0;
                $(arguments[1].target).parents("td").find('.fair_rule_basiscode').each(function () {
                    z++;
                    vars['fair_rule_basiscode' + z] = $(this).text();
                });
                var z = 0;
                $(arguments[1].target).parents("td").find('.fair_rule_departairport').each(function () {
                    z++;
                    vars['fair_rule_departairport' + z] = $(this).text();
                });
                var z = 0;
                $(arguments[1].target).parents("td").find('.fair_rule_arrivalairport').each(function () {
                    z++;
                    vars['fair_rule_arrivalairport' + z] = $(this).text();
                });
                var z = 0;
                $(arguments[1].target).parents("td").find('.fair_rule_airlines').each(function () {
                    z++;
                    vars['fair_rule_airlines' + z] = $(this).text();
                });
                var z = 0;
                $(arguments[1].target).parents("td").find('.fairbasisdepartdate').each(function () {
                    z++;
                    vars['fairbasisdepartdate' + z] = $(this).text();
                });
                args = vars;
            } else {

                var fair_rule_basiscode = $(arguments[1].target).parents("td").find('.fair_rule_basiscode').text();
                var fair_rule_departairport = $(arguments[1].target).parents("td").find('.fair_rule_departairport').text();
                var fair_rule_arrivalairport = $(arguments[1].target).parents("td").find('.fair_rule_arrivalairport').text();
                var fair_rule_airlines = $(arguments[1].target).parents("td").find('.fair_rule_airlines').text();
                var fairbasisdepartdate = $(arguments[1].target).parents("td").find('.fairbasisdepartdate').text();


                var args = new Array();
                args.push(arguments[1].target);
                args.push(fair_rule_basiscode);
                args.push(fair_rule_departairport);
                args.push(fair_rule_arrivalairport);
                args.push(fair_rule_airlines);
                args.push(fairbasisdepartdate);
            }


            window[func].apply(this, args);
        }

    });
 </script>

我的目标是有时会有多个航段。所以我可能需要使用值传递多个参数映射键的多个ajax请求。

1 个答案:

答案 0 :(得分:0)

简单的答案是它不起作用。 apply函数需要一个数组作为第二个参数,如果你给它别的东西就会失败。如果你真的必须解析一个对象并按照字母顺序应用它的属性,就像你拥有它们一样,你可以这样做。

var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
window[func].apply(this, Object.keys(args).sort().map(function (key) {
  return args[key];
}));

如果你能支持es6那么你可以缩短它。

var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
window[func].apply(this, Object.keys(args).sort().map(key => args[key]));

Object.keys(args)以对象的形式返回对象上所有键的数组:['a','b','c']

没有参数的

.sort()将返回一个按字母顺序排序的新数组,因为JS objects do not guarantee property order.

.map(key => args[key])迭代数组并使用每次迭代的返回值创建一个新数组。在这种情况下,我们返回要作为参数传递的值。

这可以保证您获得一个只包含对象值的新数组,按原始对象键的字母顺序排列。

相关问题