Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组文字中检索属性值_Javascript_Arrays_Object - Fatal编程技术网

Javascript 从数组文字中检索属性值

Javascript 从数组文字中检索属性值,javascript,arrays,object,Javascript,Arrays,Object,我一直被如何从数组文本中正确检索属性值所困扰 对象文字: var obj = { "p1": "v1", "p2": "v2", "p3": "v3" }; for (var key in obj) { if (obj.hasOwnProperty(key)) { console.log(key + " -> " + obj[key]); } } var obj = [ { "pa":"va1", "pb":"vb1" }

我一直被如何从数组文本中正确检索属性值所困扰

对象文字:

var obj = {
    "p1": "v1",
    "p2": "v2",
    "p3": "v3"
};

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key + " -> " + obj[key]);
    }
}
var obj = [
    { "pa":"va1", "pb":"vb1" },
    { "pa":"va2", "pb":"vb2" },
    { "pa":"va3", "pb":"vb3" },
    { "pa":"va4", "pb":"vb4" }
];

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key + " -> " + obj[key]);
    }
}
控制台日志输出:

数组文字:

var obj = {
    "p1": "v1",
    "p2": "v2",
    "p3": "v3"
};

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key + " -> " + obj[key]);
    }
}
var obj = [
    { "pa":"va1", "pb":"vb1" },
    { "pa":"va2", "pb":"vb2" },
    { "pa":"va3", "pb":"vb3" },
    { "pa":"va4", "pb":"vb4" }
];

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key + " -> " + obj[key]);
    }
}
控制台日志输出(duh!):

我要做的:检查字符串是否与
pa
值之一匹配。如果有,做点什么

这就是逻辑:

var myString = "a value I'm getting from somewhere else ;)"
if (myString == any of the pa values) {
    // do something
}

感谢您的帮助

obj
并不像您所期望的那样是一个对象,它是一个对象数组。您需要迭代数组,然后迭代每个数组项中的键

var i, key;

for (i = 0; i < obj.length; i++) {
  for (key in obj[i]) {
    if (obj[i].hasOwnProperty(key) {
      console.log(key + " -> " + obj[i][key]);
    }
  }
}
vari,键;
对于(i=0;i”+obj[i][key]);
}
}
}

obj
不是您期望的对象,它是一个对象数组。您需要迭代该数组,然后迭代每个数组项中的键

var i, key;

for (i = 0; i < obj.length; i++) {
  for (key in obj[i]) {
    if (obj[i].hasOwnProperty(key) {
      console.log(key + " -> " + obj[i][key]);
    }
  }
}
vari,键;
对于(i=0;i”+obj[i][key]);
}
}
}
使用方法(链接包含向旧浏览器(IE8和旧浏览器)添加功能的代码),然后检查结果数组的长度:

var obj = [
    { "pa":"va1", "pb":"vb1" },
    { "pa":"va2", "pb":"vb2" },
    { "pa":"va3", "pb":"vb3" },
    { "pa":"va4", "pb":"vb4" }
];

var filtered = obj.filter(function(element) { 
    return element.pa === myString;
});

if (filtered.length > 0) {
   // contains string
}

使用该方法(链接包含向旧浏览器(IE8和旧浏览器)添加功能的代码),然后检查生成的数组的长度:

var obj = [
    { "pa":"va1", "pb":"vb1" },
    { "pa":"va2", "pb":"vb2" },
    { "pa":"va3", "pb":"vb3" },
    { "pa":"va4", "pb":"vb4" }
];

var filtered = obj.filter(function(element) { 
    return element.pa === myString;
});

if (filtered.length > 0) {
   // contains string
}

如果您不需要知道父对象,不循环所有对象(取决于数组和对象大小)可能会提高性能。如果添加了其他嵌套级别的对象,这也将消除更改代码的需要

JSON.stringify(obj).indexOf(':"pa1"')>-1
将数组转换为如下所示的字符串:

"[{"pa":"va1","pb":"vb1"},{"pa":"va2","pb":"vb2"},{"pa":"va3","pb":"vb3"},{"pa":"va4","pb":"vb4"}]"
我们当然可以通过它进行正常的文本搜索


IE8及以上版本支持JSON.stringify()。如果您不需要知道父对象,可能会提高性能,因为它不会在所有对象之间循环(取决于数组和对象大小)。如果添加了其他嵌套级别的对象,这也将消除更改代码的需要

JSON.stringify(obj).indexOf(':"pa1"')>-1
将数组转换为如下所示的字符串:

"[{"pa":"va1","pb":"vb1"},{"pa":"va2","pb":"vb2"},{"pa":"va3","pb":"vb3"},{"pa":"va4","pb":"vb4"}]"
我们当然可以通过它进行正常的文本搜索


IE8及以上版本支持JSON.stringify()

这可能过于简单,但如果您只想知道mystring中是否有一个字符串是数组中的一个项,那么可以通过字符串对该数组进行索引

更新-我通过firebug运行了这一过程,发现我的符号不正确,无法按照我认为应该的方式使用此方法-即按标签列出对象或值的可引用列表

var obj = [];
obj["val1"] = "pa";
obj["val2"] = "pb";

mystring="val1";

if (obj[mystring]){
   alert ('object exists in array');
}
else{
    alert('object with index ' + mystring + ' does not exist');
}

无需循环,尽管您的数组设置必须更改以支持这种“查找”方法。

这可能过于简单,但如果您只想知道mystring中是否有一个字符串是数组中的一个项目,则可以通过字符串对数组进行索引

更新-我通过firebug运行了这一过程,发现我的符号不正确,无法按照我认为应该的方式使用此方法-即按标签列出对象或值的可引用列表

var obj = [];
obj["val1"] = "pa";
obj["val2"] = "pb";

mystring="val1";

if (obj[mystring]){
   alert ('object exists in array');
}
else{
    alert('object with index ' + mystring + ' does not exist');
}


无需循环,但您的阵列设置必须更改以支持这种“查找”方法。

您需要另一个
用于
obj[key]上的
循环
object.
数组中的项目是
object
s。你的问题答案正确。可能是@Mathletics的重复项是的,这就是我以前没有问过的事实。我很高兴我问了,因为现在我更清楚地知道你需要另一个
来在
obj[key]上进行
循环
object.
数组中的项是
object
s。你的问题答案正确。可能是@Mathletics的重复项是的,这就是我以前不想问的事实。我很高兴我问了,因为现在我知道betterFilter可能是做他想做的事情的最佳方式,但请确保你已经完成了如果你想支持IE8及以下版本,请点击这里。很好!这不需要IE支持。Filter可能是做他想做的事情的最佳方式,但如果你想支持IE8及以下版本,请确保你已经填充了它。很好!这不需要IE支持。+1'点击这个按钮,因为它显示了如何让控制台日志输出类似于t的内容第一个:beer:+1'ing这一个,因为它展示了如何让控制台日志输出与第一个类似的东西:beer:谢谢你花了这么多时间在这里,但我不明白为什么你要反转
“val1:”pa“
。属性在值之前……而且你的示例只是一个简单的对象文本,而不是数组(这是问题的一部分)。但为这一贡献干杯!不客气。反转实际上解决了在数组头部的对象上查找值的问题。上面的pa可以是一个对象本身,这里我只有一个字符串。通过这种方式创建数组,您可以创建一个对象索引列表,这样您就可以通过引用按名称查找对象。I在我的示例中,我只是想解决“它是否存在”的问题,但你可以更有力地使用它。有趣的是,我稍后会重新讨论你的方法。干杯!谢谢你花了这么多时间,但我不明白你为什么要反转
”val1:“pa”
。属性在值之前…此外,您的示例只是一个简单的对象文本,而不是数组(这是问题的一部分)。但为这一贡献干杯!不客气。反转实际上解决了在数组头部的对象上查找值的问题。上面的pa可以是一个对象本身,这里我只有一个字符串。通过这种方式创建数组,您可以创建一个对象索引列表,这样您就可以通过引用按名称查找对象