【问题标题】:Manipulation of Javascript objectsJavascript对象的操作
【发布时间】:2012-07-17 01:32:40
【问题描述】:

我的 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]);
}

-->但这只会提醒我“[object Object]”

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);        

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

我读过thisthisenter link description herethis,但它们似乎都处理不同的对象结构。感谢您的帮助。

更新 使用 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”。

【问题讨论】:

  • 提示使用console.log(),而不是alert()进行调试。
  • 与 php 或 cakephp 无关。请仅使用与问题相关的标签。
  • PhpMyCoder-->哎呀抱歉,我正在使用 javascript 以及 cakephp 和 php。我的错。
  • Matt Ball--> 好吧,我会尝试.. 无论结果如何,我都会在这里发帖 :)

标签: javascript jquery arrays


【解决方案1】:

更新:不推荐使用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...

【讨论】:

  • 非常感谢 nbrooks。我一直在四处游荡,远离真正的问题。谢谢。
  • 实际上,你不应该在数组上使用for...in - link
  • @johnny 相反,我认为这是迭代数组的一种非常合法(和基本)的方式。不过,为了安全起见,我添加了一个 hasOwnProperty 检查。
  • @nbrooks 这是另一个进一步讨论潜在问题的链接:link
  • @nbrooks 很公平;我想更正确的说法是,如果您在数组上使用for...in,您需要注意一些潜在的非显而易见的行为。很好的讨论,谢谢。
【解决方案2】:

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

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

【讨论】:

  • 我可以将两个答案标记为正确吗?非常感谢 JohnnyHK。
【解决方案3】:

不难做到,如下图。但是你为什么要使用像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;   
}

【讨论】:

  • 感谢斯科特的回复。我需要将它们存储在一个数组中以用于其他目的:)
  • 有很多或合理的场景需要这样的数组,但原始对象似乎更有用,尽管整个 results 对象看起来很臃肿。
【解决方案4】:

请参阅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);

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

【讨论】:

  • :) 既然你提到了它 :) 哈哈哈.. 我的错误 >.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多