循环访问JSON对象并检查特定对象是否存在

时间:2015-11-03 06:52:54

标签: javascript jquery json

我有一个JSON对象:

[{"box":1,"parent":[],"child":[{"boxId":2}]},{"box":2,"parent":[{"boxId":1}],"child":[]}]

我有一个要求,我想检查我的JSON对象是否有特定的框;如果是,则检查是否有特定的孩子。

eg: check if box 1 exists if yes then check if it has child if yes then check if it has child boxId=2

我如何在javascript / jquery中执行此操作?

这是我尝试的方式:

   var DependantArr=myJSON;
   var $hasDependancy;
   DependantArr.map(function (boxes) {
    if (boxes.box == 2) {
        if (boxes.child.length != 0) {
           boxes.child.map(function (child) {
           $hasDependancy = true;
           return false;
         });
     }
   }

这似乎不起作用,即使我返回false后它仍然继续循环。如果我找到匹配,我想打破循环。

有什么建议吗?

6 个答案:

答案 0 :(得分:2)

您需要迭代所有阵列。



var array = [{ "box": 1, "parent": [], "child": [{ "boxId": 2 }] }, { "box": 2, "parent": [{ "boxId": 1 }], "child": [] }];

function check() {
    var found = false;
    array.some(function (a) {
        if (a.box === 1) {
            Array.isArray(a.child) && a.child.some(function (b) {
                if (b.boxId === 2) {
                    found = true;
                    return true;
                }
            });
            return true;
        }
    });
    return found;
}

document.write(check());




另一种解决方案采用更通用的方法,使用给定的对象,作为所需项目的模式。

[
    { condition: { box: 1 }, nextKey: 'child' },
    { condition: { boxId: 2 } }
]



var array = [{ "box": 1, "parent": [], "child": [{ "boxId": 2 }] }, { "box": 2, "parent": [{ "boxId": 1 }], "child": [] }];
    
function check(array, conditions) {

    function c(a, index) {
        var el = conditions[index],
            k = Object.keys(el.condition),
            v = el.condition[k],
            found = false;

        return Array.isArray(a) &&
            a.some(function (b) {
                if (b[k] === v) {
                    found = true;
                    if (conditions.length > index + 1) {
                        found = c(b[el.nextKey], index + 1);
                    }
                    return true;
                }
            }) &&
            found;
    }
    return c(array, 0);
}

document.write(check(array, [{ condition: { box: 1 }, nextKey: 'child' }, { condition: { boxId: 2 } }])+'<br>');
document.write(check(array, [{ condition: { box: 2 }, nextKey: 'parent' }, { condition: { boxId: 1 } }]) + '<br>');
&#13;
&#13;
&#13;

答案 1 :(得分:1)

创建一个函数,调用数组上的filter并返回它。返回的值将是一个包含匹配条件的找到对象的数组。

Demo Snippet:检查控制台

var json = [{"box":1,"parent":[],"child":[{"boxId":2}]},{"box":2,"parent":[{"boxId":1}],"child":[]}];

function search(id, childId) {
    return json.filter(function(obj) {
        if ((obj.box == id) && (obj.child) && (obj.child.length > 0)) {
            return obj.child.filter(function(child) {
                return (child.boxId == childId);
            });
        }
    });
}

console.log(search('1', '2')[0]);
console.log(search('2', '2')[0]);

答案 2 :(得分:1)

您可以使用递归。以递归方式调用相同的函数来检查所需的元素是否确实存在于数组中。

&#13;
&#13;
var json = [{"box":1,"parent":[],"child":[{"boxId":2}]},{"box":2,"parent":[{"boxId":1}],"child":[]}];

var found = false;
function validateJson(data, box, boxId){
  for(key in data){
    if((data[key].constructor === Object || data[key].constructor === Array) && (key !== box && data[key] !== 1 || key !== boxId && data[key] !== 2)){
      arguments.callee(data[key]); // <---calls the same function again.
    } else {
      found = true; // true only in the case of if "box":1 and "boxId" : 2
    }
  }
  return found;
}
var result = validateJson(json, "box", "boxId");
document.body.innerHTML = '<pre> found : '+JSON.stringify(result) + '</pre>';
&#13;
&#13;
&#13;

答案 3 :(得分:0)

试试这个

data.forEach(function (el) {
 Object.keys(el).forEach(function (property) {
  if (el[property] === 'your  value to check') {
      // do whatever you need here
    }
  });
});

答案 4 :(得分:-1)

我认为这些会有所帮助。

  for(var i=DependantArr.length;i>=0;i--) {
                     return DependantArr[i].box == 1 &&  DependantArr[i].child.length!=0 &&
     DependantArr[i].child[0].boxId==2;

            }

答案 5 :(得分:-1)

如果这是您需要检查的唯一情况,您可以使用:

var DependantArr = [{"box": 1, "parent": [], "child": [{"boxId": 3}]}, {"box": 2, "parent": [{"boxId": 1}], "child": []}];
var $hasDependancy = DependantArr.some(function(thisBox) {
    if ((thisBox.box === 1) && (thisBox.hasOwnProperty('child'))) {
        return thisBox.child.filter(function(thisChild) {
            return thisChild.boxId === 2;
        }).length > 0;
    }
});