【问题标题】:Is it possible to functionally traverse objects in JavaScript?是否可以在 JavaScript 中功能性地遍历对象?
【发布时间】:2009-12-23 18:17:11
【问题描述】:

我认为 JavaScript 没有像 obj.first 这样的东西,但我想知道这样的东西是否可以通过任何方式实现:

var foobar = { aint: "foo", an: "bar", array: "foobar" };
var recursiveObjDump = function (obj, idx) {
    if (idx == obj.last.index) return obj[idx];
    else return obj[idx] + " " + recursiveObjDump(obj, obj[idx].next.index);
};

alert( recursiveObjDump(foobar, foobar.first.index) );

谢谢。

【问题讨论】:

  • 您只是想检查对象以进行调试吗?如果是这样,只需使用 Firebug。

标签: javascript functional-programming object


【解决方案1】:

不是真的。 Javascript 中的对象是关联数组——键/值对的集合。没有指定的顺序,就像在mathematical set 中一样(与sequence 相比)。因此,寻找object.first 之类的东西是没有意义的。

另一方面,您绝对可以在此之上强加您自己的结构。例如,您可以在 Javascript 中实现 Lisp 样式的列表,并在这些列表上递归。 This is a pretty neat article 在 Javascript 中使用函数式编程技术。

最后,Javascript 是面向对象的,而不是函数式的,所以你不会找到那些原生实现的函数原语。

编辑:如果您仍想在 Javascript 中使用函数式编程技术,请查看Functional Javascript

【讨论】:

    【解决方案2】:

    您可以使用for in 循环访问所有属性。

    这是一个基本的,您可以添加更好的检测来查找数组等。

    var foobar = { aint: "foo", an: "bar", array: "foobar" };
    
    function recusiveDump(obj) {
        var output = '';
        for(var i in obj) {
            if(obj.hasOwnProperty(i)) {
                if(typeof obj[i] == 'object') {
                    output += recusiveDump(obj[i]);
                } else {
                    output += obj[i];
                }
            }
        }
        return output;
    }
    
    alert(recusiveDump(foobar));
    

    【讨论】:

    • 函数recursiveDump调用自己;因此它是递归的。
    【解决方案3】:

    如果您只想序列化一个对象,请使用JSON.stringify()。它在 Javascript 5 中是本机的,您可以从 Crockford 的网站下载脚本以获取较低的 javascript 版本。 (同样的脚本可以安全地将 JSON 对象序列化重新解析回 javascript 对象)

    【讨论】:

      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多