indexOf对象数组而不是数组

时间:2017-06-01 06:21:32

标签: javascript ecmascript-6

我知道在数组中存在或不存在值我可以使用indexOf,但是如何使用对象数组呢?

const x = [{
  "id": "roadshows",
  "name": "Roadshows"
}, {
  "id": "sporting_events",
  "name": "Sporting Events"
}]

console.log( x.indexOf('roadshows') ) // don't work

5 个答案:

答案 0 :(得分:6)

由于标记为,因此这是一个ES6数组方法:Array#findIndex()

const x = [{
  "id": "roadshows",
  "name": "Roadshows"
}, {
  "id": "sporting_events",
  "name": "Sporting Events"
}]

console.log( x.findIndex( o => o.id === 'roadshows' ) )

如果您想要一种更具可重用性的方法,请考虑创建工厂isId(id)

function isId(id) {
  return (o) => o.id === id;
}

const x = [{
  "id": "roadshows",
  "name": "Roadshows"
}, {
  "id": "sporting_events",
  "name": "Sporting Events"
}]

console.log( x.findIndex( isId('roadshows') ) )

这被称为“工厂”,因为它是一个在其范围内返回带有传递参数的函数的函数。

答案 1 :(得分:0)

你必须循环,因为你在数组中有对象。

for(var i = 0; i < x.length; i++) {
    if (x[i].id== 'roadshows') {
        console.log(i);
        break;
    }
}

或者,如果您只是检查该对象是否存在该ID,则过滤器很方便

if (x.filter(function(e) x.id== 'roadshows').length > 0) {
  // Yay. Do Something
}

答案 2 :(得分:0)

手动我会做这样的事情:

for(let item of x) {
 if ( item.hasOwnProperty('id') && item['id'] == 'roadshows' ) {   
    //do your stuff here
 }
}

答案 3 :(得分:0)

你有几个选择。

首先,findIndex。您传递一个函数来测试元素是否正在查找,它返回使该函数返回true的第一个元素的索引。

x.findIndex((o) => o.id === 'roadshows');

const x = [{
  "id": "roadshows",
  "name": "Roadshows"
}, {
  "id": "sporting_events",
  "name": "Sporting Events"
}];

console.log(x.findIndex((o) => o.id === 'roadshows'));

另一个选项是mapping数组的相关属性和searching中的相应属性。

x.map((o) => o.id).indexOf('roadshows');

const x = [{
  "id": "roadshows",
  "name": "Roadshows"
}, {
  "id": "sporting_events",
  "name": "Sporting Events"
}];

console.log(x.map((o) => o.id).indexOf('roadshows'));

答案 4 :(得分:0)

如果你可以使用es6并希望返回有问题的对象,那么总会有Array.prototype.find()

x.find( item => { return item.id === "roadshows" } )

// returns {id: "roadshows", name: "Roadshows"}