Javascript 对象数组中的indexOf方法?
获取包含对象的数组索引的最佳方法是什么 想象一下这个场景:Javascript 对象数组中的indexOf方法?,javascript,Javascript,获取包含对象的数组索引的最佳方法是什么 想象一下这个场景: var hello = { hello: 'world', foo: 'bar' }; var qaz = { hello: 'stevie', foo: 'baz' } var myArray = []; myArray.push(hello,qaz); 现在我想使用索引对象,该对象的hello属性是'stevie',在本例中,该属性是1 我对JavaScript非常熟悉,我不知道是否有一个简单的方
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
现在我想使用索引
对象,该对象的hello
属性是'stevie'
,在本例中,该属性是1
我对JavaScript非常熟悉,我不知道是否有一个简单的方法,或者我是否应该构建自己的函数来实现这一点。在除IE(非edge)之外的所有浏览器中都受支持。但是提供的服务很好
var idx = myArray.reduce( function( cur, val, index ){
if( val.hello === "stevie" && cur === -1 ) {
return index;
}
return cur;
}, -1 );
var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");
使用map的解决方案是可以的。但每次搜索时,您都会对整个数组进行迭代。这只是findIndex最糟糕的情况,一旦找到匹配项,findIndex就会停止迭代
实际上没有一种简洁的方法(当开发人员不得不担心IE8时),但这里有一个常见的解决方案:
var searchTerm = "stevie",
index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i].hello === searchTerm) {
index = i;
break;
}
}
请参见此示例:
for(i=0;i
它开始以零开始计数。或将其原型化:Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) {
for (var i = 0, len = this.length; i < len; i++) {
if (this[i][property] === value) return i;
}
return -1;
}
myArr.indexOfObject("name", "stevie");
Array.prototype.indexOfObject=函数arrayObjectIndexOf(属性,值){
for(var i=0,len=this.length;i
我认为您可以使用以下函数在一行中解决它:
function arrayObjectIndexOf(myArray, searchTerm, property) {
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i][property] === searchTerm) return i;
}
return -1;
}
arrayObjectIndexOf(arr, "stevie", "hello"); // 1
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
我喜欢Pablo的答案,但是数组indexOf和数组map并不能在所有浏览器上工作。下划线将使用本机代码(如果可用),但也有回退。此外,它还提供了Pulk方法,可以完全实现Pablo的匿名映射方法的功能
var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();
我更喜欢使用
findIndex()
方法:
var index = myArray.findIndex('hello','stevie');
索引
将为您提供索引编号。您可以创建自己的原型来执行此操作:
比如:
Array.prototype.indexOfObject = function (object) {
for (var i = 0; i < this.length; i++) {
if (JSON.stringify(this[i]) === JSON.stringify(object))
return i;
}
}
Array.prototype.indexOfObject=函数(对象){
for(var i=0;i
注意[0]
使用reduce
是合适的,就像Antonio Laguna
的答案一样
抱歉这么简单…我制作了一个通用函数来检查下面的代码是否适用于任何对象
function indexOfExt(list, item) {
var len = list.length;
for (var i = 0; i < len; i++) {
var keys = Object.keys(list[i]);
var flg = true;
for (var j = 0; j < keys.length; j++) {
var value = list[i][keys[j]];
if (item[keys[j]] !== value) {
flg = false;
}
}
if (flg == true) {
return i;
}
}
return -1;
}
var items = [{ "hello": 'world', "foo": 'bar' }];
var selectedItem = { "hello": 'world', "foo": 'bar' };
alert(items.indexOf(selectedItem));
alert(indexOfExt(items, selectedItem));
函数indexOfExt(列表,项){
var len=list.length;
对于(变量i=0;i
第一个警报将返回-1(表示未找到匹配项),第二个警报将返回0(表示找到匹配项)。
用例:
应用程序编程接口:
这是在数组中查找对象索引的方法
var myArray = [{ hello: 'world',
foo: 'bar'
},{
hello: 'stevie',
foo: 'baz'
}];
for (i = 0; i < myArray.length; i++) {
if (myArray[i].hello === 'stevie') {
alert('position: ' + i);
return;
}
}
var myArray=[{你好:'world',
福:“酒吧”
},{
你好:'史蒂夫',
福:“巴兹”
}];
对于(i=0;i
使用查找索引
下面是一个例子
.findIndex([{a:1},{a:2,c:10},{a:3}],{a:2,c:10})//1
这在没有自定义代码的情况下工作
var arr, a, found;
arr = [{x: 1, y: 2}];
a = {x: 1, y: 2};
found = JSON.stringify(arr).indexOf(JSON.stringify(a)) > - 1;
// found === true
注意:这不会给出实际索引,它只告诉您的对象是否存在于当前数据结构中
使用ES6,不使用lodash或任何其他库,您可以编写:
function deepIndexOf(arr, obj) {
return arr.findIndex(function (cur) {
return Object.keys(obj).every(function (key) {
return obj[key] === cur[key];
});
});
}
这将比较对象的直接属性,但不会递归到属性中
如果您的实现尚未提供findIndex
(大多数未提供),则可以添加支持此搜索的轻型多边形填充:
function deepIndexOf(arr, obj) {
function findIndex = Array.prototype.findIndex || function (pred) {
for (let i = 0; i < this.length; ++i) {
if (pred.call(this, this[i], i)) {
return i;
}
}
return -1;
}
return findIndex.call(arr, function (cur) {
return Object.keys(obj).every(function (key) {
return obj[key] === cur[key];
});
});
}
函数deepIndexOf(arr,obj){
函数findIndex=Array.prototype.findIndex | |函数(pred){
for(设i=0;i
(从我的回答来看)此外,您还可以使用(对于不受限制的浏览器,有一个)
我看到人们否决了这个答案,我希望他们这样做是因为语法错误,因为在我看来,这是最优雅的方式
如果数组中的元素满足提供的测试函数,则findIndex()方法返回数组中的索引。否则返回-1
例如:
var hello={
您好:'世界',
福:“酒吧”
};
变量qaz={
你好:'史蒂夫',
福:“巴兹”
}
var myArray=[];
推送(你好,qaz);
var index=myArray.findIndex(函数(元素){
return element.hello=='stevie';
});
警报(索引)代码>请尝试以下操作:
console.log(Object.keys({foo:"_0_", bar:"_1_"}).indexOf("bar"));
简单:
myArray.indexOf(myArray.filter(function(item) {
return item.hello == "stevie"
})[0])
您可以使用本机且方便的函数Array.prototype.findIndex()
基本上:
如果数组中的元素满足提供的测试函数,则findIndex()方法返回数组中的索引。否则返回-1
请注意,Internet Explorer、Opera和Safari不支持此功能,但您可以使用下面链接中提供的Polyfill
更多信息:
var hello={
您好:'世界',
福:“酒吧”
};
变量qaz={
你好:'史蒂夫',
福:“巴兹”
}
var myArray=[];
推送(你好,qaz);
var index=myArray.findIndex(函数(元素、索引、数组){
如果(element.hello==='stevie'){
返回true;
}
});
警报(“stevie在索引处:”+索引)代码>您只需使用
const
var myArray = [{ hello: 'world',
foo: 'bar'
},{
hello: 'stevie',
foo: 'baz'
}];
for (i = 0; i < myArray.length; i++) {
if (myArray[i].hello === 'stevie') {
alert('position: ' + i);
return;
}
}
var arr, a, found;
arr = [{x: 1, y: 2}];
a = {x: 1, y: 2};
found = JSON.stringify(arr).indexOf(JSON.stringify(a)) > - 1;
// found === true
function deepIndexOf(arr, obj) {
return arr.findIndex(function (cur) {
return Object.keys(obj).every(function (key) {
return obj[key] === cur[key];
});
});
}
function deepIndexOf(arr, obj) {
function findIndex = Array.prototype.findIndex || function (pred) {
for (let i = 0; i < this.length; ++i) {
if (pred.call(this, this[i], i)) {
return i;
}
}
return -1;
}
return findIndex.call(arr, function (cur) {
return Object.keys(obj).every(function (key) {
return obj[key] === cur[key];
});
});
}
console.log(Object.keys({foo:"_0_", bar:"_1_"}).indexOf("bar"));
myArray.indexOf(myArray.filter(function(item) {
return item.hello == "stevie"
})[0])
myArray.map(x => x.hello).indexOf('stevie')
myArray.findIndex(x => x.hello === 'stevie')
Array.prototype.indexOfObject = function (property, value) {
for (var i = 0, len = this.length; i < len; i++) {
if (this[i][property] === value) return i;
}
return -1;
}
myArray.indexOfObject("hello", "stevie");
myArray.indexOfObject("hello", "stevie");
var hello = {hello: "world", foo: "bar"};
var qaz = {hello: "stevie", foo: "baz"};
var myArray = [];
myArray.push(hello,qaz);
function indexOfObject( arr, key, value ) {
var j = -1;
var result = arr.some(function(obj, i) {
j++;
return obj[key] == value;
})
if (!result) {
return -1;
} else {
return j;
};
}
alert(indexOfObject(myArray,"hello","world"));
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var qazCLONE = { // new object instance and same structure
hello: 'stevie',
foo: 'baz'
}
var myArray = [hello,qaz];
myArray.indexOf(qaz) // should return 1
myArray.indexOf(qazCLONE) // should return -1
// indexOf wrapper for the list of objects
function indexOfbyKey(obj_list, key, value) {
for (index in obj_list) {
if (obj_list[index][key] === value) return index;
}
return -1;
}
// Find the string in the list (default -1)
var test1 = indexOfbyKey(object_list, 'name', 'Stevie');
var test2 = indexOfbyKey(object_list, 'last_name', 'some other name');