Javascript对象的操作

Manipulation of Javascript objects

本文关键字:操作 对象 Javascript      更新时间:2023-11-09

我的javascript中有一个对象,看起来像这样:

{"data":[{"t":{
                "level":"35",
                "longtitude":"121.050321666667",
                "latitude":"14.6215366666667",
                "color":"#040098"}},
         {"t":{
                "level":"31",
                "longtitude":"121.050316666667",
                "latitude":"14.621545",
                "color":"#040098"}},
         {"t":{
                "level":"29",
                "longtitude":"121.050323333333",
                "latitude":"14.62153",
                "color":"#040098"}},
//  .....

我想做的是遍历对象的内容,这样我就可以独立地将它们推送到各自的数组中。我有一个经度、纬度、颜色和级别的数组。

所以我尝试了以下方法:

var size = 0, key;
for (key in result) {
    if (result.hasOwnProperty(key)) size++;
    alert(result.data[size]);
}

-->但这只会提醒我"[对象对象]"

success: function(result){
    var size = 0, key;
    for (key in result) {
        for(var attr in key){
            alert(attr['latitude']);
        }
    }
}

-->这给了我未定义的结果[key]

我已经通过这些代码检查了我的物体的大小只有1

var size = 0, key;
for (key in result) {
    if (result.hasOwnProperty(key)) size++;
}
alert(size);        

我相信只有"数据"被读取。而"数据"中的其他内容则被忽略。

我读过这个,这个,在这里输入链接描述,还有这个,但它们似乎都处理不同的对象结构。提前感谢您的帮助。

更新使用console.log(),我已经确认,如果我没有弄错的话,只有第一个属性被提取

t
    Object { level="35", longtitude="121.0508", latitude="14.6204083333333", more...}
color       "#040098"
latitude    "14.6204083333333"
level       "35"
longtitude  "121.0508"

我试过这个

for (key in result) {
            if (result.hasOwnProperty(key)) size++;
            console.log(result.data[size]['level']);
        }

-->但上面写着未定义的

基于我的对象的结构

data:[{"t":{'others'},'others'...]

如何读取"数据"中的所有内容?每个"数据"都有"t"。

更新:不建议使用for...in构造在数组上迭代。另一种选择是常规的for循环(当然,每种方法都有各自的优势):

for(var i=0; i<results.data.length; i++){
    alert(results.data[i]['t']['latitude']);
    // etc...
}


请注意JSON的结构。还要注意,javascript foreach循环迭代键/索引,而不是值。请参阅演示:http://jsfiddle.net/g76tN/

success: function(result){
    var latitudes = [];
    // and so on...
    for (var idx in result.data ) {
        if( result.data.hasOwnProperty(idx) ){
            alert( result.data[idx]['t']['latitude'] );
            // So you would do something like this:
            latitudes.push ( result.data[idx]['t']['latitude'] );
            // and so on...
        }
    }
}​

注意,对于收集数组中对象的属性,jQuery$.map()(或者说本机js数组映射)是一个整洁、有用的替代方法。

var latitudes = $.map( result.data, function(n){
    return n['t']['latitude'];
});
// and so on...

假设result是您的对象,这应该只是在data数组上迭代的问题:

for (var i = 0; i < result.data.length; ++i) {
    console.log(result.data[i].t.latitude);
    ...
}

这并不难做到,如下所示。但是,为什么要采用像t这样有用的对象,并将它们变成这样的数组呢?

var levels = [], longitudes= [], latitudes = [], colors = [];
var result = {"data":[{"t":{
            "level":"35",
            "longtitude":"121.050321666667",
            "latitude":"14.6215366666667",
            "color":"#040098"}},
     {"t":{
            "level":"31",
            "longtitude":"121.050316666667",
            "latitude":"14.621545",
            "color":"#040098"}},
     {"t":{
            "level":"29",
            "longtitude":"121.050323333333",
            "latitude":"14.62153",
            "color":"#040098"}}
]};
var data = result.data;
var i, len, t;
for (i = 0, len = data.length; i < len; i++) {
    t = data[length].t;
    levels[i] = t.level;
    longitudes[i] = t.longtitude;
    latitudes[i] = t.latitude;
    colors[i] = t.color;   
}

请参阅http://jsfiddle.net/VGmee/,它保留了hasOWnProperty(这很重要),而您拼错的"经度"则不是。

var data = input.data,
    result = {level: [], longtitude: [], latitude: [], color: []};
for (var i = 0, n = data.length; i < n; i += 1) {
    var info = data[i].t;
    for (var property in info) {
        if (info.hasOwnProperty(property)) {
            result[property].push(info[property]);
        }
    }
}
console.log(result.level);
console.log(result.latitude);
console.log(result.longtitude);
console.log(result.color);

这需要结果数组在输入数组中实际具有属性,但您可以根据需要添加错误处理。