2017-04-05 126 views
-4

我有一个对象,我想在当前月份之前/之前使Months为false。如何循环浏览JavaScript对象的属性对象

前:

var oObj = { 
       "isJan" : true, 
       "isFeb" : true, 
       "isMar" : true, 
       "isApr" : true, 
       "isMay" : true, 
       "isJun" : true, 
       "isJul" : true, 
       "isAug" : true, 
       "isSep" : true, 
       "isOct" : true, 
       "isNov" : true, 
       "isDec" : true 
      } 

今天是5月,因此对象应该是:

  { 
       "isJan" : false, 
       "isFeb" : false, 
       "isMar" : false, 
       "isApr" : false, 
       "isMay" : true, 
       "isJun" : true, 
       "isJul" : true, 
       "isAug" : true, 
       "isSep" : true, 
       "isOct" : true, 
       "isNov" : true, 
       "isDec" : true 
      } 
+2

请告诉我们你已经尝试了什么。你卡在哪里? – Bergi

+0

可能的重复[如何循环或枚举JavaScript对象?](https://stackoverflow.com/questions/684672/how-do-i-loop-through-or-enumerate-a-javascript-object) – boghyon

回答

0

您可以使用for循环如图他人。但是,你也想确保你得到的关键是对象的实际属性,而并非来自原型:

for (var key in p) { 
if (p.hasOwnProperty(key)) { 
console.log(key + " -> " + p[key]); 
} 
} 

希望这将帮助!

0

你可以做这样的事情:

var keys = Object.keys(oObj) 

这给数组形式的所有键。然后你可以使用简单的for循环来解析它。

for(var i=0; i<keys.length; i++){ 
    var individual_obj = oObj[key[i]] ; 
    // set your conditions here 
} 
1

试试这个

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 
 
/*var inputObj = { 
 
    "isJan": true, 
 
    "isFeb": true, 
 
    "isMar": true, 
 
    "isApr": true, 
 
    "isMay": true, 
 
    "isJun": true, 
 
    "isJul": true, 
 
    "isAug": true, 
 
    "isSep": true, 
 
    "isOct": true, 
 
    "isNov": true, 
 
    "isDec": true 
 
};*/ 
 
var currentMonth = new Date().getMonth(); 
 
var outputObj = {}; 
 
months.forEach(function(key, index){ 
 
    outputObj[ "is" + key ] = (index <= currentMonth); 
 
}); 
 
console.log(outputObj);

+0

很干净。 +1 –

-1
  • 拿钥匙
  • 获取当前月份加1(因为你想避免月太)
  • 环直到月份值并使其为假

就是这样。

var oObj = { 
 
    "isJan": true, 
 
    "isFeb": true, 
 
    "isMar": true, 
 
    "isApr": true, 
 
    "isMay": true, 
 
    "isJun": true, 
 
    "isJul": true, 
 
    "isAug": true, 
 
    "isSep": true, 
 
    "isOct": true, 
 
    "isNov": true, 
 
    "isDec": true 
 
} 
 
var k = Object.keys(oObj); 
 
var month = new Date().getMonth() + 1; 
 
console.log(i); 
 
for (var i = 0; i < month; i++) { 
 
    oObj[k[i]] = false; 
 
} 
 

 
console.log(oObj);

+0

JavaScript不确保按照键添加到对象的顺序列出键。尽管现在它在V8中的工作方式如此,但他们可以在不违反标准的情况下对其进行更改以利于优化。如果您想按照添加的顺序列出密钥,地图就是要走的路。 –

0

使用Object.keys()Array.prototype.indexOf()String.prototype.slice()功能的解决方案:

var oObj = { 
 
     "isJan" : true,"isFeb" : true,"isMar" : true,"isApr" : true,"isMay" : true,"isJun" : true,"isJul" : true,"isAug" : true,"isSep" : true,"isOct" : true,"isNov" : true,"isDec" : true 
 
    }, 
 
    monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], 
 
    currentM = new Date().getMonth(); 
 

 
Object.keys(oObj).forEach(function (k) { 
 
    oObj[k] = monthNames.indexOf(k.slice(2)) > currentM; 
 
}); 
 

 
console.log(oObj);

+0

我想它应该是'slice(0,3)'。顺便说一句,这是一个很好的答案。编辑:Woops。我的失败。认为该名单是月份名称('Januany'等)。切片很好。 –

-1

你需要做两件事情

  1. 遍历对象 可以使用Object.keys获取对象的排列键的

  2. 使循环 内的条件要检查的对象的关键月份当月之前或不。为此,你可以使用getMonth功能从Date对象

例子:

const oObj = { 
 
\t "isJan" : true, 
 
    "isFeb" : true, 
 
    "isMar" : true, 
 
    "isApr" : true, 
 
    "isMay" : true, 
 
    "isJun" : true, 
 
    "isJul" : true, 
 
    "isAug" : true, 
 
    "isSep" : true, 
 
    "isOct" : true, 
 
    "isNov" : true, 
 
    "isDec" : true 
 
} 
 
const now = new Date(); 
 
const currentMonth = now.getMonth(); 
 
const keys = Object.keys(oObj); 
 

 
for (var i = 0; i < keys.length; i += 1){ 
 
     oObj[keys[i]] = currentMonth < i; 
 
} 
 
console.log(oObj);

+0

JavaScript不能确保按照它们添加到对象的顺序列出键。尽管现在它在V8中的工作方式如此,但他们可以在不违反标准的情况下对其进行更改以利于优化。如果您想按照添加的顺序列出密钥,地图就是要走的路。 –