【问题标题】:How i can pass an extra parameter via the function used by the Array.forEach method?我如何通过 Array.forEach 方法使用的函数传递额外的参数?
【发布时间】:2014-01-03 08:51:50
【问题描述】:

我有一个数组:

var allchildsAr = new Array();

我用一个具有parent 属性(一个对象)和一个chlds 属性的对象填充它,该属性是一个数组。

这是填充数组的代码:

Ti.API.info("*****allchildsAr["+level+"] is null and "+elmn+" children will be added to it ");
allchildsAr[level] = new Array({parent:elmn,chlds:elmn.getChildren()}); 

这是我在添加后尝试显示数组的方式:

  Ti.API.info("*****allchildsAr["+level+"] after add");
allchildsAr[level].forEach(logArrayJsonElements);

logArrayJsonElements 方法如下:

function logArrayElements(elemnt, indx, array) {
    Ti.API.info("*****Element at [" + indx + "]   : " + elemnt.id);
}

function logArrayJsonElements(elemnt, indx, array) {
    Ti.API.info("*****Element at [" + indx + "]   : " + elemnt.parent.id);
    elemnt.chlds.forEach(logArrayElements);
}

这很好用,但我想要的是通过logArrayElements 传递父元素,这样我就可以将它显示为数组显示元素的父元素(然后用它做其他事情..)

function logArrayElements(elemnt, indx, array, parent) {
    Ti.API.info("*****Element at [" + indx + "]   : " + elemnt.id+" child of :"+parent);
}

现在我很困惑,因为当在 forEach 内部调用 logArrayElements 时,它不接受参数并且它们被隐式传递,如果我像我一样添加 parent,它会被用作另一个参数(通常是element 参数)并且无论如何我都没有传递它们,所以我将如何在函数中获取parent 并使foreach 像其他参数一样传递它?

【问题讨论】:

  • 我以为我已经在 StackOverflow 上了!!我没有注意到我在错误的地方..

标签: javascript arrays foreach


【解决方案1】:

您可以通过将forEach 行修改为:

function logArrayJsonElements(elemnt, indx, array) {
    Ti.API.info("*****Element at [" + indx + "]   : " + elemnt.parent.id);
    elemnt.chlds.forEach(function (element, index, arr) {
        logArrayElements(element, index, arr, elemnt.parent.id);
    });
}

【讨论】:

  • 我做了类似的事情:)
  • 函数 logArrayJsonElements(elemnt, indx, 数组) { var parentElm = ""; function logArrayElements(elemnt, indx, array) { Ti.API.info("*****Element at [" + indx + "] : " + elemnt.id+" child of :"+parentElm); Ti.API.info("*****Element at [" + indx + "] : " + elemnt.parent.id); parentElm = elemnt.parent.id; elemnt.chlds.forEach(logArrayElements); }
  • 但我希望我可以像其他人一样隐式传递父元素,我认为这可以通过覆盖原型来完成
  • 我想你可以,使用bind。像这样:elemnt.chlds.forEach(logArrayElements.bind(this, {parent:elemnt.parent.id}),(父对象充当预设的前导参数)但您必须将 logArrayElements 函数修改为function logArrayElements(parent, elemnt, indx, array)。这应该工作,试试吧,让我知道
【解决方案2】:

好吧,如果element 已经有一个parent 属性,那么为什么不在logArrayElements 中使用element.parent

假设元素不是相同的数据结构,那么bind也部分适用,所以你可以这样做:

function logArrayElements(parent, element, index, array) {
    console.log("Element at [%s] : %s child of %s", index, element.id, parent);
}

function logArrayJsonElements(element, index, array) {
    element.chlds.forEach(logArrayElements.bind(null, element.parent));
}

【讨论】:

    【解决方案3】:

    logArrayJsonElements 内将logArrayElements 绑定到parent 属性设置为parent 的对象

    function logArrayJsonElements(elemnt, indx, array) {
        Ti.API.info("*****Element at [" + indx + "]   : " + elemnt.parent.id);
        elemnt.chlds.forEach(logArrayElements.bind({parent: elemnt.parent}));
    }
    

    logArrayElements.bind({parent: elemnt.parent}) 将返回一个新的Function 对象,其上下文将在调用时设置为{parent: elemnt.parent},允许您使用this.parent 访问parent 对象。

    并修改logArrayElements,去掉parent参数,使用this.parent访问父对象:

    function logArrayElements(elemnt, indx, array) {
        Ti.API.info("*****Element at [" + indx + "]   : " + elemnt.id+" child of :" this.parent);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      相关资源
      最近更新 更多