Omu*_*Omu 49 javascript jquery json
我有这个数组:
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
Run Code Online (Sandbox Code Playgroud)
通过知道名称可以获得价值或特定元素吗?
这样的事情:
arr['k2'].value
Run Code Online (Sandbox Code Playgroud)
要么
arr.get('k1')
Run Code Online (Sandbox Code Playgroud)
Lan*_*don 65
我知道这个问题很老,但还没有人提到原生解决方案.如果您不想尝试支持过时的浏览器(此时您不应该这样),您可以使用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]);Run Code Online (Sandbox Code Playgroud)
Check the console.Run Code Online (Sandbox Code Playgroud)
将来使用ES6,您将能够使用array.find.
nnn*_*nnn 45
通常通过数字索引访问数组,因此在您的示例中arr[0] == {name:"k1", value:"abc"}.如果您知道name每个对象的属性都是唯一的,则可以将它们存储在对象而不是数组中,如下所示:
var obj = {};
obj["k1"] = "abc";
obj["k2"] = "hi";
obj["k3"] = "oa";
alert(obj["k2"]); // displays "hi"
Run Code Online (Sandbox Code Playgroud)
如果您确实需要像帖子中那样的对象数组,则可以循环遍历数组并在找到具有所需属性的对象的元素时返回:
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
Run Code Online (Sandbox Code Playgroud)
use*_*737 20
找一个元素
要在数组中查找具有给定名称的元素,您可以使用find:
arr.find(item=>item.name=="k1");
Run Code Online (Sandbox Code Playgroud)
注意,find只返回一个项目(即第一个匹配):
{
"name": "k1",
"value": "abc"
}
Run Code Online (Sandbox Code Playgroud)
找到所有元素
在原始数组中,每个名称只出现一个项目.
如果数组包含多个具有相同名称的元素,并且您希望它们全部使用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);Run Code Online (Sandbox Code Playgroud)
查找索引
同样,对于可以使用的索引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);Run Code Online (Sandbox Code Playgroud)
myt*_*thz 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;
}
};
Run Code Online (Sandbox Code Playgroud)
这会将get()方法添加到所有数组,让你做你想做的,即:
arr.get('k1'); //= abc
Run Code Online (Sandbox Code Playgroud)