Зацикливание массива внутри JSON

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

Сотрудник []. 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

2
задан user134414214 30 нояб. '14 в 14:58
источник поделиться
2 ответов

проблема в том, что эта строка

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

проверить обновленную скрипку

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

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

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

здесь, в скрипке

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

0
ответ дан winner_joiner 30 нояб. '14 в 16:44
источник поделиться

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

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;
    }
	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;
    }
	return getField(nextObj,nextPath,nextArrPos);
}
1
ответ дан Sampath Liyanage 30 нояб. '14 в 15:13
источник поделиться

Другие вопросы по меткам