-2

我需要将“键”作为一个字符串,然后将它们的值作为另一个字符串。

这是我编写此循环的失败尝试,它仅在一个级别上真正起作用...

function convertToString(objArray) {
    var str = '';

    for (var i = 0; i < objArray.length; i++) {
        var line = '';
        for (var index in objArray[i]) {
            if (line != '') line += ','

            line += objArray[i][index];
        }

        str += line + '\r\n';
    }

    return str;
}

这是一个示例对象,真实的对象要大得多,但这应该用于示例目的:

var obj = {
    "a": "a",
        "b": [{
        "c": "c",
            "d": "d"
    }, {
        "e": "e",
            "f": "f"
    }],
    "g": true,
    "h": {
        "i": "i",
        "j": "j",
        "k": 1
    },
    "l": "l"
};

我想要的按键输出是:

"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"

它们各自的值字符串如下所示:

"a", object, "c", "d", "e", "f", true, object, "i", "j", 1, "l"

如果有人能引导我朝着正确的方向前进,那就太好了,我不希望有人为我编写代码,但是让我开始的东西会很棒。

这背后的目的是,我可以将我的响应对象转换为我可以用来下载相同数据的 CSV 文件的格式。

4

3 回答 3

4

您可以在 javascript 中使用递归 for..in,如下所示:

http://jsbin.com/udEBAxe/2/edit

var obj = {
    "a": "a",
        "b": [{
        "c": "c",
            "d": "d"
    }, {
        "e": "e",
            "f": "f"
    }],
    "g": true,
    "h": {
        "i": "i",
        "j": "j",
        "k": 1
    },
    "l": "l"
};

function inspect(o, props){
  var kk = [];
  for(var p in o) {
    if(o.hasOwnProperty(p)) {      
      if(typeof o[p] == 'object')
        kk = kk.concat(inspect(o[p], props));
      else {
        var m = (props) ? o[p] : p;
        kk.push(m);
      }
    }
  }
  return kk;
}

var s = inspect(obj,false);
alert(s.join(','));

s = inspect(obj,true);
alert(s.join(','));
于 2013-10-01T07:15:23.080 回答
2

尝试

var obj = {
    "a": "a",
        "b": [{
        "c": "c",
            "d": "d"
    }, {
        "e": "e",
            "f": "f"
    }],
        "g": true,
        "h": {
        "i": "i",
            "j": "j",
            "k": 1
    },
        "l": "l"
};

function x(obj, keys, vals) {
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            var val = obj[key];
            keys.push(key);
            vals.push(val);
            if (typeof val == 'object') {
                //borrowed from angularjs isArray
                //http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js
                if (toString.apply(val) == '[object Array]') {
                    for (var i = 0; i < val.length; i++) {
                        x(val[i], keys, vals)
                    }
                } else {
                    x(val, keys, vals)
                }
            }
        }
    }
}

var keys = [],
    vals = [];
x(obj, keys, vals);
console.log(keys)
console.log(vals)

演示:小提琴

于 2013-10-01T06:55:50.747 回答
0

好的,您的输出显示的是值,而不是对象的键。

您可以使用 underscore.js 库简单地获取所有键。这是仅顶层的示例:

_.keys(obj);
// output : [ "a","b","g","h","l" ];

和文档:http ://underscorejs.org/#keys

于 2013-10-01T06:49:17.497 回答