我有这个数组:
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
是否可以通过知道名称来获取值或特定元素?
类似的东西:
arr['k2'].value
或
arr.get('k1')
答案 0 :(得分:58)
我知道这个问题很老,但还没有人提到原生解决方案。如果您不尝试支持过时的浏览器(此时您不应该这样做),可以使用array.filter
:
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
var found = arr.filter(function(item) { return item.name === 'k1'; });
console.log('found', found[0]);

Check the console.

您可以看到 list of supported browsers here 。
将来使用ES6,您将能够使用 array.find 。
答案 1 :(得分:45)
通常通过数字索引访问数组,因此在您的示例arr[0] == {name:"k1", value:"abc"}
中。如果您知道每个对象的name
属性是唯一的,则可以将它们存储在对象而不是数组中,如下所示:
var obj = {};
obj["k1"] = "abc";
obj["k2"] = "hi";
obj["k3"] = "oa";
alert(obj["k2"]); // displays "hi"
如果您确实需要像帖子中那样的对象数组,则可以循环遍历数组,并在找到包含具有所需属性的对象的元素时返回:
function findElement(arr, propName, propValue) {
for (var i=0; i < arr.length; i++)
if (arr[i][propName] == propValue)
return arr[i];
// will return undefined if not found; you could return a default instead
}
// Using the array from the question
var x = findElement(arr, "name", "k2"); // x is {"name":"k2", "value":"hi"}
alert(x["value"]); // displays "hi"
var y = findElement(arr, "name", "k9"); // y is undefined
alert(y["value"]); // error because y is undefined
alert(findElement(arr, "name", "k2")["value"]); // displays "hi";
alert(findElement(arr, "name", "zzz")["value"]); // gives an error because the function returned undefined which won't have a "value" property
答案 2 :(得分:18)
要回答您的确切问题,您可以通过以下方式扩展Array原型来获得所需的确切行为:
Array.prototype.get = function(name) {
for (var i=0, len=this.length; i<len; i++) {
if (typeof this[i] != "object") continue;
if (this[i].name === name) return this[i].value;
}
};
这会将get()方法添加到所有数组中,让你做你想做的事,即:
arr.get('k1'); //= abc
答案 3 :(得分:13)
查找一个元素
要在数组中查找具有给定名称的元素,您可以使用find
:
arr.find(item=>item.name=="k1");
请注意find
只会返回一个项目(即第一个匹配项):
{
"name": "k1",
"value": "abc"
}
查找所有元素
在原始数组中,每个名称只出现一个项目。
如果数组包含多个具有相同名称的元素,并且您想要它们全部,则使用filter
,这将返回一个数组。
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
arr.push({name:"k1", value:"def"});
var item;
// find the first occurrence of item with name "k1"
item = arr.find(item=>item.name=="k1");
console.log(item);
// find all occurrences of item with name "k1"
// now item is an array
item = arr.filter(item=>item.name=="k1");
console.log(item);
查找索引
同样,对于索引,您可以使用findIndex
(用于查找第一个匹配项)和filter
+ map
来查找所有索引。
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
arr.push({name:"k1", value:"def"});
var idx;
// find index of the first occurrence of item with name "k1"
idx = arr.findIndex(item=>item.name == "k1");
console.log(idx, arr[idx].value);
// find indices of all occurrences of item with name "k1"
// now idx is an array
idx = arr.map((item, i) => item.name == "k1" ? i : '').filter(String);
console.log(idx);
答案 4 :(得分:3)
你不能用数组做你原生的问题,但是javascript对象是哈希,所以你可以说...
var hash = {};
hash['k1'] = 'abc';
...
然后您可以使用括号或点表示法检索:
alert(hash['k1']); // alerts 'abc'
alert(hash.k1); // also alerts 'abc'
对于数组,一般检查underscore.js library,特别是detect method。使用detect你可以做类似的事情......
_.detect(arr, function(x) { return x.name == 'k1' });
或者更一般地说
MyCollection = function() {
this.arr = [];
}
MyCollection.prototype.getByName = function(name) {
return _.detect(this.arr, function(x) { return x.name == name });
}
MyCollection.prototype.push = function(item) {
this.arr.push(item);
}
etc...
答案 5 :(得分:2)
我对jquery一无所知,所以无法帮助你,但就Javascript而言,你有一个对象数组,所以你只能访问这些名称&amp;每个数组元素的值。 E.g arr[0].name
将为您'k1'
,arr[1].value
将为您提供'hi'
。
也许你想做类似的事情:
var obj = {};
obj.k1 = "abc";
obj.k2 = "hi";
obj.k3 = "oa";
alert ("obj.k2:" + obj.k2);
答案 6 :(得分:0)
我使用的最简单的方法是
var found = arr.find(function(element) {
return element.name === "k1";
});
//If you print the found :
console.log(found);
=> Object { name: "k1", value: "abc" }
//If you need the value
console.log(found.value)
=> "abc"
可以使用类似的方法基于JSON中的任何输入数据从JSON数组中查找值。