【问题标题】:How to loop through properties of JavaScript Object [duplicate]如何遍历JavaScript对象的属性[重复]
【发布时间】:2017-08-30 13:45:44
【问题描述】:

我有一个对象,我想在当前月份/之前将 Months 设为 false。

之前:

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
            }

今天是 4 月 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
            }

【问题讨论】:

  • 请向我们展示您的尝试。你被困在哪里了?

标签: javascript object javascript-objects


【解决方案1】:

你需要做两件事

  1. 遍历对象 您可以使用Object.keys 获取对象的键数组

  2. 在循环内创建条件 检查对象键中的月份是否在当前月份之前。为此,您可以使用来自Date 对象的getMonthfunction

示例:

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

【讨论】:

  • JavaScript 不确保键按添加到对象的顺序列出。尽管这就是它现在在 V8 中的工作方式,但他们可以在不违反标准的情况下对其进行更改以进行优化。如果您想按照添加键的顺序列出键,则可以使用地图。
【解决方案2】:

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

【讨论】:

  • 我猜应该是slice(0, 3)。顺便说一句,这是一个很好的答案。编辑:哎呀。我的失败。认为列表是月份名称(Januany 等)。切片很好。
【解决方案3】:
  • 拿钥匙
  • 获取当前月份并加 1(因为您也想避开 4 月)
  • 循环直到月份值并将其设为假

就是这样。

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

【讨论】:

  • JavaScript 不确保键按添加到对象的顺序列出。尽管这就是它现在在 V8 中的工作方式,但他们可以在不违反标准的情况下对其进行更改以进行优化。如果您想按照添加键的顺序列出键,则可以使用地图。
【解决方案4】:

试试这个

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

【讨论】:

  • 很干净。 +1
【解决方案5】:

你可以这样做:

var keys = Object.keys(oObj)

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

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

【讨论】:

    【解决方案6】:

    您可以使用其他人展示的 for-in 循环。但是,您还需要确保获得的键是对象的实际属性,而不是来自原型:

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多