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