从名称数组中获取一个项,值为JSON

时间:2011-08-16 08:29:46

标签: javascript jquery json

我有这个数组:

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')

7 个答案:

答案 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数组中查找值。