2014-11-30 2 views
2

Я пытаюсь извлечь значение из объекта JSON. Ниже приведены данные. .. Я пытаюсь Переберите все объекты массива и получить значениеЗацикливание массива внутри JSON

Employee [] gradeDetails.objDetails [] SNO

Ниже приведен код, который я до сих пор:

var Obj = { 
 
    "Employee": [{ 
 
    "type": "grade A", 
 
    "gradeDetails": { 
 
     "objDetails": [{ 
 
     "sno": "100", 
 
     "name": "", 
 
     "desg": "writer", 
 
     "salary": "1000000" 
 
     }, { 
 
     "sno": "200", 
 
     "name": "", 
 
     "desg": "developer", 
 
     "salary": "1000" 
 
     }, { 
 
     "sno": "300", 
 
     "name": "", 
 
     "desg": "", 
 
     "salary": "8000" 
 
     }] 
 
    } 
 
    }] 
 
} 
 
var path = "Employee[].gradeDetails.objDetails[].sno"; 
 

 
var arrayPos = [ 
 
    [0, 0], 
 
    [0, 1], 
 
    [0, 2] 
 
]; 
 
arrayPos.forEach(function(val) { 
 
    var data = getField(Obj, path, val); 
 
}) 
 

 
function getField(postObj, path, arrayPosition) { 
 
    arrayPosition = arrayPosition.slice(Math.max(arrayPosition.length - 2, 0)); 
 
    var postObj = JSON.parse(JSON.stringify(postObj)); 
 
    var pathArray = path.split("."); 
 
    pathArray.forEach(function(key) { 
 
    if (key.indexOf("[]") != -1) { 
 
     var position = 0; 
 
     try { 
 
     var flag = false; 
 
     if (arrayPosition.length == 1) { 
 
      flag = true; 
 
     } 
 
     if (arrayPosition.length > 1) { 
 
      position = arrayPosition.shift(); 
 
     } 
 
     var pos = 0; 
 
     var arrOcc = -1; 
 
     var occIndex = -1; 
 
     while (pos != -1) { 
 
      pos = path.indexOf("[]", occIndex + 1); 
 
      arrOcc += 1; 
 
      occIndex = pos; 
 
     } 
 
     if (arrOcc == 1) { 
 
      position = arrayPosition[arrayPosition.length - 1]; 
 
      console.log("Postion" + position); 
 
     } 
 
     key = key.substring(0, key.indexOf("[")); 
 
     postObj = postObj[key]; 
 
     if (arrOcc == 2) { 
 
      if (flag) { 
 
      if (postObj.length == 2) { 
 
       position = arrayPosition[arrayPosition.length - 1]; 
 
      } 
 
      } 
 
     } 
 
     if (position == undefined) position = 0; 
 
     postObj = postObj[position]; 
 
     } catch (e) {} 
 
    } else { 
 
     try { 
 
     postObj = postObj[key]; 
 
     } catch (e) {} 
 
    } 
 
    }); 
 

 
    console.log("Result[" + arrayPosition + "]" + postObj) 
 

 
    return postObj; 
 
}

Поскольку существует три объекта массива, я ожидал три различных значения sno, как показано ниже. Может кто-нибудь помочь мне узнать, что я ошибаюсь в своем коде. Потому что я получаю всегда результат как 100.

Result[0]100 
Result[1]200 
Result[2]300 

Мой полный код доступен в этой ссылке JSFIDDLE

+0

Отправьте соответствующие части своего кода здесь. –

ответ

0

проблема, эта линия

 if (postObj.length == 2) { //should be 3 not 2 
       position = arrayPosition[arrayPosition.length - 1]; 
     } 

проверка обновляется fiddle

Ps: код немного " комплекс ", может быть больше структуры, это поможет отладки.

Но если вы ищете более короткий вариант, вот этот вариант короче (8 Line Solution), и должны иметь ту же функцию

function getField(postObj, path, arrayPosition) { 

    // Replaces square brakets with the Index of the passed Array(plus a dot) . 
    var newPath = path.replace(/(\[\])/gi,function(){return "." + arrayPosition.shift();}); 
    //creates a list of property 'namens' 
    var pathElements = newPath.split("."); 
    var value = postObj; 
    for(var x in pathElements){ 
     // In each step it goes deeper into the json Object 
     value = value[pathElements[x]]; 
    } 
    return value; 
} 

здесь fiddle

обновление: просто добавил в код те же комментарии.

+0

Спасибо, что нашли проблему. Оно работало завораживающе!! – user134414214

1

Я попытался понять код. Но, похоже, на это уходит время, так как вы не прокомментировали код, чтобы показать нам, что вы пытаетесь сделать. Я повторно реализовал его рекурсивным способом (обработка ошибок не реализована). Надеюсь, что это поможет ...

var Obj = { 
 
    "Employee": [ 
 
     { 
 
      "type": "grade A", 
 
      "gradeDetails": { 
 
       "objDetails": [ 
 
        { 
 
         "sno": "100", 
 
         "name": "", 
 
         "desg": "writer", 
 
         "salary": "1000000" 
 
        }, 
 
        { 
 
         "sno": "200", 
 
         "name": "", 
 
         "desg": "developer", 
 
         "salary": "1000" 
 
        }, 
 
        { 
 
         "sno": "300", 
 
         "name": "", 
 
         "desg": "", 
 
         "salary": "8000" 
 
        } 
 
       ] 
 
      } 
 
     } 
 
    ] 
 
}; 
 

 
var path = "Employee[].gradeDetails.objDetails[].sno"; 
 
var arrayPos = [[0, 0], [0, 1], [0, 2]]; 
 

 
arrayPos.forEach(function (val) { 
 
    alert(getField(Obj, path, val)); 
 
}); 
 

 
function getField(obj, path, arrayPosition) { 
 
    if (path == ""){ 
 
     return obj; 
 
    } 
 
\t var property = path.split(".")[0]; 
 
    var nextPath = path.replace(property,"").replace(".",""); 
 
    var nextObj; 
 
    var nextArrPos; 
 
    if (property.indexOf("[]") != -1){ 
 
     nextObj = obj[property.replace("[]","")][arrayPosition[0]]; 
 
     nextArrPos = arrayPosition.slice(1); 
 
    } else { 
 
     nextObj = obj[property]; 
 
     nextArrPos = arrayPosition; 
 
    } 
 
\t return getField(nextObj,nextPath,nextArrPos); 
 
}

+0

@plbsm Спасибо за ответ. Но то же самое, что я хочу, чтобы он работал через мою функцию. – user134414214