2014-11-17 12 views
-2

나는 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 }); 
     } 

하지만 각 키는 4 각각의 values.I을 가져야한다 3 keys.Those에 따라 값을 검색 할 DettolRadiance, DettolSkinCare, DettolToiletSoaps.So 만 Values.I 검색 할 수 있습니다 나는 내가 다른를 추가 할 필요가 있다고 생각 loop.But을 위해 내가

+0

'model'은 객체 리터럴이고 배열이 아닙니다. 나는 그것을 반영하기 위해 제목을 편집했다. – max

+0

또한 $ (종종 jQuery)로 전달하고 싶지 않습니다. – max

+0

사물을 매우 분명하게 해준 것에 감사드립니다. –

답변

0

.. 정확한 syntax.Can 사람이 도움을 주시기 바랍니다 못하고 있어요 난 당신이 코드를해야한다고 생각

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

+0

@ rjdmello. 내가 model.DettolSkinCare를 시도 할 때 콘솔에서 undefined라고 말합니다. 모델 [0] .DettolSkinCare를 주면이 객체 {값 : 배열 [4], 키 : "DettolSkinCare"}와 같은 콘솔에서 데이터를 가져옵니다. –

+0

내가 뭘 시도했는지 http://jsfiddle.net/o08vot1z/ – rjdmello

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

이 함수는 객체의 유형을 확인하고 둘 다 true가 아닌 경우 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); 
    } 
}); 

이것은 객체를 통해 가장 깊은 루트까지 반복합니다.

+0

... 내 코드를 통해 루프를 반복 할 수 있습니다. 각 요소도 액세스 할 수 있습니다. 내 의심은 어떻게 중첩 된 for 루프를 사용하여 값과 함께 해당 키를 가져올 수 있습니다. 모든 값과 키를 검색 할 수 있습니다. 그러나 특정 키에 해당하는 값을 얻을 수 있도록 키를 검색 할 코드를 어디에 작성해야하는지 알고 싶습니다. –

+0

@papirtiger 방식이 복잡 해졌습니까? 나 한테? 함수를 통해 모든 것을 사용할 수있게 만들었습니까? 나머지는 함수에 대한 설명입니다 ... –

+0

아니요, 저는 아닙니다 - OP는 주어진 구조로 객체의 속성을 반복하는 법을 물었습니다. jQuery/Underscore/LoDash'.each'와'.map'에 이미 존재하는 함수를 반복적으로 루프하는 함수가 아닙니다. – max

-1

for..in으로 객체 적합성을 반복 할 수 있습니다.

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

hasOwnProperty은 "진짜"속성이 있음을 보장하고 누군가가 Object.prototype와 monkying 된 경우 우리는 난처하게되지 않는다.

수집 된 MonthOfSale하고 Values에 내부 루프 for..in을 사용 각 제품의 GRPsValue 배열을 얻으려면.

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 (첨가)

괄호에 포장하지 리터럴 표기법 객체를 만들기

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

를 결과이지만 리터럴을 함수에 전달하려고했던 것처럼 보이기 때문에 혼란 스럽습니다.

EDIT. 이것은 귀하가 수락 한 답변과 동일합니다.

var data_set = []; 

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

. 나는 내 코드를 통해 루프를 반복 할 수있다. 나는 또한 각 요소에 접근 할 수있다. 내 의심치는 어떻게 중첩 된 for 루프를 사용하여 값과 함께 해당 키를 얻을 수 있는가이다. 나는 모든 값과 keys.But을 검색 할 수 있지만 특정 키에 해당하는 값을 얻을 수 있도록 키를 검색 할 코드를 어디에 작성해야하는지 알고 싶습니다. - @ papirtiger –

+0

원래의 질문과 전혀 다릅니다. 'key'라는 단어를 매우 혼란스러운 방식으로 사용하고 있기 때문에 원하는 결과를 작성하면 훨씬 더 쉽습니다. 키는 대개 개체의 속성 이름 (왼쪽)을 설명하는 데 사용됩니다. - "키"라고 부르는 속성 (오른쪽)의 가치에 대해 이야기 할 때. – max

관련 문제