下划线js采用嵌套键值

时间:2014-11-21 09:24:22

标签: javascript underscore.js

我有一个像这样的JS对象

var obj = {
    "2014" : {
        "11" : {
            "20" : {
                "Counts" : {
                    "c" : 2
                }
            },
            "21" : {
                "Counts" : {
                    "c" : 20
                }
            },
            "22" : {
                "Counts" : {
                    "c" : 20
                }
            }
        }
    },
    "_id" : "53d6883a2dc307560d000004",
    "createdate" :"2014-11-21T07:15:26.109Z"
};

如您所见,这是包含年份> - >月 - >日 - >计数 - > c->值结构的结构 我想把这一天和(c)的价值从中抽出来

我试过这样的事情

_.pluck(obj,'11')

但这只是一个月好,并且没有像

这样的日子工作
_pluck(_.pluck(obj,'11'),'20') 

3 个答案:

答案 0 :(得分:17)

您可以像这样使用地图。 Pluck是地图的精致版本。

_.map(obj.2014.11, function (item) {
  return item.Counts.c
}

这将为您提供一个包含11中嵌入的所有c值的数组。 但如果我误解了你的意图,我不会感到惊讶......

答案 1 :(得分:1)

就个人而言,我会创建按日期键入的数据结构,然后基于它们创建视图(看起来很像沙发结构):

var obj = {
"2014-11-20" : {
   "Counts" : {
      "c" : 2
   }
},
"2014-11-21" : {
   "Counts" : {
      "c" : 20
   }
},
"2014-11-22" : {
   "Counts" : {
      "c" : 20
   }
},
"_id" : "53d6883a2dc307560d000004",
"createdate" :"2014-11-21T07:15:26.109Z"
};

但鉴于您现有的结构,您可能只需要进行缩减(实际上是多次):

var allcounts = _.reduce(obj,function(result,item,key) {
  // key is now "2014", item is the value of {"11":....}
  _.reduce(item,function(result,item,key) {
    // key is now "11", item is the value of {"20":....}
    _.reduce(item,function(result,item,key) {
      // key is now the date, like "20", item is the value of {"Counts":{"c":2}}
      result.push(item.Counts.c);
    },result);
  },result);
},[]);

丑陋,但我想不出用这种深层嵌套的数据结构更好的方法

您可以通过使用第一个,第二个,第三个key中的_.reduce() var来限制范围。

答案 2 :(得分:0)

你可以这样做:

var obj = {
                "2014" : {
                    "11" : {
                        "20" : {
                            "Counts" : {
                                "c" : 2
                            }
                        },
                        "21" : {
                            "Counts" : {
                                "c" : 20
                            }
                        },
                        "22" : {
                            "Counts" : {
                                "c" : 20
                            }
                        }
                    }
                },
                "_id" : "53d6883a2dc307560d000004",
                "createdate" :"2014-11-21T07:15:26.109Z"
            };


     for(x in obj){
        // console.log(obj[x]);
         for(y in obj[x]){
             for(z in obj[x][y]){
         console.log(obj[x][y][z]);// your output here
             }
         }
     }

但如果可能的话,最好明确构建日期。