我有一个遵循以下格式的javascript数组:
var arrayName = [
{id: "a", gender: "man", item: "stuff"},
{id: "b", gender: "woman", item: "stuff"},
{id: "c", gender: "man", item: "stuff"},
{id: "d", gender: "man", item: "stuff"}
];
有没有办法可以使用array.indexOf在数组中查找索引,例如我知道“id”变量。
例如我试过;
var position = arrayName.indexOf("b");
arrayName[position].gender = "man"
我正在使用的那一刻;
for(var i=0; i<arrayName.length; i++) {
if(arrayName[i].id == "b"){
arrayName[i].gender = "man";
}
}
这第二种技术有效,但我使用的实际数组在每个条目中有150个条目和10个项目,因此当我知道要编辑的条目的“id”时,循环遍历它似乎非常浪费。如果我能让它工作的话,indexOf将会更加清晰。
答案 0 :(得分:19)
您对indexOf
的调用是针对字符串b
检查数组中的对象,这将无法正常工作。
循环遍历数组元素以找到正确的id是一个简单的解决方案。
或者,您可以创建自己的indexOf函数:
Array.prototype.indexOfId = function(id) {
for (var i = 0; i < this.length; i++)
if (this[i].id === id)
return i;
return -1;
}
var arrayName = [
{ id: "a", gender: "man", item: "stuff" },
{ id: "b", gender: "woman", item: "stuff" },
{ id: "c", gender: "man", item: "stuff" },
{ id: "d", gender: "man", item: "stuff" }];
var position = arrayName.indexOfId("b");
alert(position); //alerts 1
这是fiddle
修改强>
如果要将数组元素与任何属性进行比较,请按以下步骤操作(注意我使用[]语法来获取任意属性)
Array.prototype.indexOfField = function (propertyName, value) {
for (var i = 0; i < this.length; i++)
if (this[i][propertyName] === value)
return i;
return -1;
}
var position = arrayName.indexOfField("id", "b");
alert(position); //alerts 1
position = arrayName.indexOfField("gender", "man");
alert(position); //alerts 0
或者,如果您不想使用Array的原型,并且不介意使用旧浏览器中不存在的功能,则可以使用Array的filter
函数
var position = arrayName.indexOf(arrayName.filter(function (val) {
return val.id === "b";
})[0]);
请注意,IE8中不存在此功能,因此要支持此浏览器,您必须抓住shim from MDN
编辑 - oops,indexOf对旧浏览器也不友好。如果您选择第二段代码并希望支持IE,那么您还必须抓住indexOf from here
的垫片答案 1 :(得分:1)
如果有机会,可以使用Array.prototype.filter:
var arrayName = [
{id: "a", gender: "man", item: "stuff"},
{id: "b", gender: "woman", item: "stuff"},
{id: "c", gender: "man", item: "stuff"},
{id: "d", gender: "man", item: "stuff"}
];
console.log(arrayName.filter(function(i) {
return i.id === 'b';
}));
这将给出:
[ { id: 'b', gender: 'woman', item: 'stuff' } ]
答案 2 :(得分:0)
您可以使用indexOf
prototype
Array.prototype.indexOf = function(elem) {
for (var i = 0; i < this.length; i++){
if (this[i].id === elem)
return i;
}
return -1;
}
var arrayName = [
{id: "a", gender: "man", item: "stuff"},
{id: "b", gender: "woman", item: "stuff"},
{id: "c", gender: "man", item: "stuff"},
{id: "d", gender: "man", item: "stuff"}
];
alert(arrayName.indexOf("b"));