在对象数组中找到特定属性

时间:2015-08-05 11:38:38

标签: javascript

我使用以下代码,我想找到路径是否等于某个键 我尝试使用以下循环但没有成功,我在这里做错了什么?

我需要找到密钥是否存在

https://jsfiddle.net/0ukL2jxh/

var obj = {
    "prov": [{
        "save": {
            "key": "aaa",
            "method": "sa"
        },
        "delete": {
            "key": "bbb",
            "method": "del"
        }
    }]
};

var obj2 = {
    "prov": [{
        "save": {
            "key": "ccc",
            "method": "sa"
        },
        "delete": {
            "key": "ccc",
            "method": "del"
        }
    }]
};

var myArray = [];
myArray.push(obj);
myArray.push(obj2);

for (var i = 0; i < myArray.length; i++) {
    var configObj = configs[i];

    for (var j = 0; configObj; j++) {
        var prov = configObj[j];

        for (var x = 0; prov; x++) {
            var obj = prov[x];

            for (var y = 0; obj; y++) {
                  if (obj.key === 'aaa')
                      exit;
            }
        }
    }
}
}

1 个答案:

答案 0 :(得分:2)

如何将数组对象仅映射到键中(从对象中提取键),然后对给定元素进行简单的数组搜索?

var keys = myArray.map(function(e, i){
   return e.prov[0].save.key;
});

// keys = ["aaa", "ccc"]

// will give you the index of the element, -1 if does not exist
var index = keys.indexOf("ccc");
在你的例子中,你会做

if (index > -1)
   exit; // although I do not recognize such javascript statement :-)

<强>更新

好吧,经过你方的一些额外解释后,问题变得更加清晰了。

我认为这就是你所需要的:

function f(array, keyName, keyValue) {
   function findKey(obj) {
       var keyFound = false;

       for(var property in obj) {
          if (property == keyName && obj[property] == keyValue) {
             return true;
          }
          else if(typeof(obj[property]) == "object") {
            keyFound = findKey(obj[property], property);
            if (keyFound)
               return keyFound;
          }
          else {
            if (obj == keyValue)
               keyFound = true;
          }
       }       


       return keyFound;
   }
   var keyFound = false;
   for (var i = 0; i < array.length; i++) {
       keyFound = findKey(array[i]);
       if (keyFound)
          break;
   }

   return keyFound;
}

//usage:
//f(myArray, "delete", "method") -> false
//f(myArray, "keydasd", "aaa") -> false
//f(myArray, "key", "aaa") -> true
//f(myArray, "method", "del") -> true

功能'f'参数

obj =&gt;你的数组包含对象

keyName =&gt;搜索匹配值的键的名称

keyValue =&gt;钥匙的价值......

仅供记录: 感谢您,我了解到您可以为此问题制作通用解决方案,创建类似

的功能
function f(obj, objPath, keyValue)

其中objPath可以是您想要以字符串形式搜索匹配值的键的任何路径。然后使用eval,您可以访问obj的匹配值

eval (obj[objPath])

以下是这样一个例子:

var o = { 
   a: 1,
   b: {
     c: [
       {
       x: "xxx",
       y: 1205
      },
      {
       x: 1020,
       y: 8274
      }
     ],
     d: 1000
   }
}

var p1 = "o.b"
var p2 = ".c[0].x"

eval(p1 + p2)
//result: "xxx"