在JavaScript中循环对象的属性?

时间:2014-11-17 06:44:38

标签: javascript loops for-loop

我有一组数据。你会在JavaScript中使用for循环遍历这些数据吗?

    var model = ({
        "DettolRadiance":
            {
                "Values": [{ "GRPsValue": 66, "MonthOfSale": "Jan" },
                  { "GRPsValue": 100, "MonthOfSale": "Feb" },
                  { "GRPsValue": 250, "MonthOfSale": "March" },
                  { "GRPsValue": 100, "MonthOfSale": "April" }],
                "Key": "DettolRadiance"
            },
        "DettolSkinCare":
            {
                 "Values": [{ "GRPsValue": 487, "MonthOfSale": "Jan" },
                        { "GRPsValue": 450, "MonthOfSale": "Feb" },
                        { "GRPsValue": 300, "MonthOfSale": "March" },
                        { "GRPsValue": 400, "MonthOfSale": "April" }],
                 "Key": "DettolSkinCare"
            },
        "DettolToiletSoaps":
                    {
                 "Values": [{ "GRPsValue": 64, "MonthOfSale": "Feb" },
                            { "GRPsValue": 0,  "MonthOfSale": "Jan" },
                            { "GRPsValue": 70, "MonthOfSale": "March" },
                            { "GRPsValue": 150, "MonthOfSale": "April" }],
                 "Key": "DettolToiletSoaps"
             }
    });

这是我尝试过的代码。

      var DataSet = [];

           for (var i = 0; i < model[0].DettolRadiance.Values.length; i++) {

            DataSet.push({ 'x': model[0].DettolRadiance.Values[i].MonthOfSale, 'y': model[0].DettolRadiance.Values[i].GRPsValue });

        }

            for (var i = 0; i < model[0].DettolSkinCare.Values.length; i++) {

            DataSet.push({ 'x': model[0].DettolSkinCare.Values[i].MonthOfSale, 'y': model[0].DettolSkinCare.Values[i].GRPsValue });
        }


             for (var i = 0; i < model[0].DettolToiletSoaps.Values.length; i++) {

            DataSet.push({ 'x': model[0].DettolToiletSoaps.Values[i].MonthOfSale, 'y': model[0].DettolToiletSoaps.Values[i].GRPsValue });
        }

但是我只能检索Values.I想要根据3个键检索值。这些是DettolRadiance,DettolSkinCare,DettolToiletSoaps.So每个键应该有4个相应的值。我想我需要添加另一个for循环。但是我没有得到确切的语法。任何人都可以帮助..

3 个答案:

答案 0 :(得分:0)

我认为你的代码应该是

&#13;
&#13;
  var model = ({
        "DettolRadiance":
            {
                "Values": [{ "GRPsValue": 66, "MonthOfSale": "Jan" },
                  { "GRPsValue": 100, "MonthOfSale": "Feb" },
                  { "GRPsValue": 250, "MonthOfSale": "March" },
                  { "GRPsValue": 100, "MonthOfSale": "April" }],
                "Key": "DettolRadiance"
            },
        "DettolSkinCare":
            {
                 "Values": [{ "GRPsValue": 487, "MonthOfSale": "Jan" },
                        { "GRPsValue": 450, "MonthOfSale": "Feb" },
                        { "GRPsValue": 300, "MonthOfSale": "March" },
                        { "GRPsValue": 400, "MonthOfSale": "April" }],
                 "Key": "DettolSkinCare"
            },
        "DettolToiletSoaps":
                    {
                 "Values": [{ "GRPsValue": 64, "MonthOfSale": "Feb" },
                            { "GRPsValue": 0,  "MonthOfSale": "Jan" },
                            { "GRPsValue": 70, "MonthOfSale": "March" },
                            { "GRPsValue": 150, "MonthOfSale": "April" }],
                 "Key": "DettolToiletSoaps"
             }
    });

var DataSet = [];

           for (var i = 0; i < model.DettolRadiance.Values.length; i++) {
            DataSet.push({ 'x': model.DettolRadiance.Values[i].MonthOfSale, 'y': model.DettolRadiance.Values[i].GRPsValue });

        }

            for (var i = 0; i < model.DettolSkinCare.Values.length; i++) {

            DataSet.push({ 'x': model.DettolSkinCare.Values[i].MonthOfSale, 'y': model.DettolSkinCare.Values[i].GRPsValue });
        }


             for (var i = 0; i < model.DettolToiletSoaps.Values.length; i++) {

            DataSet.push({ 'x': model.DettolToiletSoaps.Values[i].MonthOfSale, 'y': model.DettolToiletSoaps.Values[i].GRPsValue });
        }
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

我编写了两个函数,允许您迭代数组/对象的每个单独成员或对象和数组的组合(就像你的一样)。

首先,我编写了一个函数来迭代array/object的每个成员。但是这个函数还使用另一个函数来检查对象是object object还是object array,因为我们应该对这两种类型稍微使用不同的技术。

function _recursive(obj, callback)
{
  var len;
  var objectKeys;
  var i  = 0;
  if(isArrayOrObject(obj) === 'array') 
  {
     len = obj.length; 
     iterator = i;
  }
  else if(isArrayOrObject(obj) === 'object') 
  {
     len = Object.keys(obj).length;

     objectKeys = Object.keys(obj);
  }

   for(i = 0; i < len; i++)
   {
       var currentElement;

       if(isArrayOrObject(obj) === 'array') 
       {
         currentElement = obj[i];
       }
       else if(isArrayOrObject(obj) === 'object') 
       {
         currentElement = obj[objectKeys[i]];
       }

       callback(currentElement);

       if(isArrayOrObject(currentElement) !== false)
       {         
             _recursive(currentElement, function(element){
                    callback(element);
              }); 
           }
       }
    }

此函数检查对象的类型,如果两者都不为则返回false。

function isArrayOrObject(inp)
{ 
  if(typeof inp !== 'object') return false;  
  if( Object.prototype.toString.call( inp ) === '[object Array]' ) 
    {
        return "array";
    } 
    else 
    {
      return "object"; 
    }

}

以下是我们称之为的方式。我们将回调传递给我们的函数,以应用于数组的每个成员。

_recursive(model, function(element){

    if(typeof element !== 'object')
    {
        console.log(element); 
    }
});

这会将对象循环到最深的根。

答案 2 :(得分:-1)

您可以使用for..in循环使用对象特性。

for (var prop in obj) {
  if( obj.hasOwnProperty( prop ) ) {
    console.log("o." + prop + " = " + obj[prop]);
  } 
}

hasOwnProperty确保它是一个“真正的”属性,如果有人与Object.prototype进行僧侣合作,我们就不会被绊倒。

要获取包含每个产品的已收集MonthOfSaleGRPsValue的数组,您将for..in使用内部循环Values

function proccessData(data){
    var result = [];

    for (var prop in data) {
        if( data.hasOwnProperty( prop ) ) {
            (function(product){
                var val, i, len = product.Values.length;
                for (i = 0; i < len; i++){
                    val = product.Values[i];
                    result.push({
                        x: val['MonthOfSale'],
                        y: val['GRPsValue']
                    });
                }
            }(data[prop]));
        }
    }

    return result;
}

jsFiddle http://jsfiddle.net/maxcal/9uoqm6f8/3/

PS :(已添加)

使用文字符号创建对象时,请不要将其包装在parens中:

var model = {}; // good
var model = ({}); // bad, is there something missing here?

虽然结果是一样的,但它很混乱,因为看起来你可能打算将文字传递给一个函数。

编辑。这与您接受的答案相同。

var data_set = [];

for (var prop in model) {
  if( model.hasOwnProperty( prop ) ) {
     data_set.push({ values: model[prop].Values, key: model[prop].Key })
  } 
}