【问题标题】:Returning Arrays and ChildNodes返回数组和子节点
【发布时间】:2013-11-12 15:52:30
【问题描述】:

我有以下代码:

var actionsAllowed = $(packet).find('actionsAllowed').get();

var actionArray = $(actionsAllowed).each(function () {
    var actionNodes = this.childNodes;
    var actionNumber = actionNodes.length;
    var array = new Array(actionNumber)

    for (var i = 0; i < actionNodes.length; i++) {
        var action = actionNodes[i].nodeName
        array[i] = action
        console.log(action);
    }
    return array;
});

这会在数据包 (XML) 中搜索 "actionsAllowed" 并将其返回为 "[actionsAllowed]"

然后,我尝试使用数组中列出的每个操作创建一个数组。

"this" 变为 "actionsAllowed" 而没有 "[ ]" 并允许它以“NodeList[ActionOne, ActionTwo, ActionThree]”的形式返回子节点。 然后我得到 NodeList 的长度并创建一个该长度的数组。

然后我遍历 NodeList 并将每个添加到数组中。

最后返回数组为"[ActionOne, ActionTwo, ActionThree]",太棒了!

但是 - 这就是问题所在:

变量"actionArray" 变为"Object[actionsAllowed]",而不是数组。

知道为什么会这样吗?我有一个理论,但我无法解决它=(

谢谢!

【问题讨论】:

  • $(actionsAllowed).each( always 返回一个 jquery 对象。你希望return array; 做什么?
  • actionArray = actionArray.get() 应该可以工作。
  • 我希望“返回数组;”将“actionArray”定义为“array”。但事实并非如此,还有其他方法可以做到这一点吗?
  • 嗯,就目前而言,我不知道你的最终结果应该是什么,所以现在我不知道该建议什么。
  • @Gary:当您从.eachreturn 时,它的行为类似于break(用于虚假值)和continue(用于真实值)。我想你可能正在寻找.map()

标签: javascript jquery arrays iteration children


【解决方案1】:

$(actionsAllowed).each 返回迭代的第一个元素。你似乎想要这个:

var actionArray = [];
$(actionsAllowed).each(function () {
    var actionNodes = this.childNodes;
    var actionNumber = actionNodes.length;
    var array = new Array(actionNumber)

    for (var i = 0; i < actionNodes.length; i++) {
        var action = actionNodes[i].nodeName
        array[i] = action
        console.log(action);
    }
    actionArray.push(array);
});    

编辑:如果您想要的是一个大数组而不是数组数组,请将其更改为

var actionArray = [];
$(actionsAllowed).each(function () {
    var actionNodes = this.childNodes;
    for (var i = 0; i < actionNodes.length; i++) {
        var action = actionNodes[i].nodeName
        actionArray.push(action);
        console.log(action);
    }
});    

【讨论】:

  • 他不能用.map()吗?
  • @megawac .map 需要返回 this 才能执行与 dystroy 在这里所做的相同的事情。他不是简单地替换数组中的每个元素,而是将所有子节点添加到数组中。
  • 小心 .map 并没有真正返回一个数组,你至少必须在之后使用 .get。
  • 效果很好,谢谢!尽管它确实将 actionArray 返回为 [[ActionOne,....,ActionThree]] 但这应该不是什么大问题。
  • @Gary 这可能很容易解决,但实际上我并不真正了解您的目标。你想对数组进行非规范化吗?
【解决方案2】:

这是另一种选择:

var actionArray = $('actionsAllowed > *').map(function (el) { 
    return el.nodeName; 
}).get();

【讨论】:

  • +1 现在我们有了完整的规范,这是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多