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

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.

  • 请记住:“filter”不允许数组内容发生变化,这可能是也可能不是您想要的。 (2认同)

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)

  • 您的findElement函数中存在一个小错误.它不使用索引变量(i).它应该是:if(arr [i] [propName] == ...并且在回报中 (2认同)

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)