如何在JavaScript中通过其属性获取对象的索引?

rsb*_*der 208 javascript arrays object

例如我有:

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]
Run Code Online (Sandbox Code Playgroud)

然后我想通过例如排序/反转这个对象name.我得到这样的东西:

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]
Run Code Online (Sandbox Code Playgroud)

现在我想知道带有属性的对象索引name='John'来获取属性令牌的值.

Ger*_*sio 288

由于排序部分已经回答.我将提出另一种优雅的方法来获取数组中属性的indexOf

你的例子是:

var Data = [
    {id_list:1, name:'Nick',token:'312312'},
    {id_list:2,name:'John',token:'123123'}
]
Run Code Online (Sandbox Code Playgroud)

你可以做:

var index = Data.map(function(e) { return e.name; }).indexOf('Nick');
Run Code Online (Sandbox Code Playgroud)

Array.prototype.map在IE7或IE8上不可用.ES5兼容性

这里有ES6和箭头语法,这更简单:

const index = Data.map(e => e.name).indexOf('Nick');
Run Code Online (Sandbox Code Playgroud)

  • 无论怎样,我都要迭代整个数组.第一种方法不需要. (3认同)
  • 在ES6版本中进行映射,然后进行indexOf确实意味着它们将在数组上循环两次。相反,您应该使用我的答案中显示的findIndex方法 (3认同)

sil*_*513 179

如果你使用ES6就好了.数组现在有findIndex函数.这意味着你可以这样做:

const index = Data.findIndex(item => item.name === 'John');
Run Code Online (Sandbox Code Playgroud)

  • 放下最直接,最优雅的解决方案,我想说的不是findIndex是贪婪的(在我的情况下这是完美的),但是用户要知道,如果您有具有重复值的对象(即,两个具有“ name:John”的对象) )这只会传回第一个比赛 (4认同)
  • 抱歉@Jos,但我认为你不太了解[贪婪搜索算法的作用](https://brilliant.org/wiki/greedy-algorithm/)。贪心算法仅考虑手头的信息,这在计算上非常高效,例如,当您只需要一个结果时搜索列表中的一项。findIndex 方法是贪婪的,因为它只返回第一个匹配项。如果它不贪心的话,它会继续搜索。您正在考虑日常英语中使用的术语“贪婪”,但在编程的上下文中(即SO),它与您的想法相反;) (4认同)
  • 感谢您解释@GrayedFox。我对贪婪的引用实际上也来自编程,但与正则表达式有关,其中贪婪比非贪婪需要更多的字符!:-) (2认同)

Chr*_*ett 155

正如其他答案所示,循环遍历数组可能是最好的方法.但我会把它放在它自己的功能中,并使它更抽象一点:

function findWithAttr(array, attr, value) {
    for(var i = 0; i < array.length; i += 1) {
        if(array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

var Data = [
    {id_list: 2, name: 'John', token: '123123'},
    {id_list: 1, name: 'Nick', token: '312312'}
];
Run Code Online (Sandbox Code Playgroud)

有了这个,您不仅可以找到哪个包含'John',而且您可以找到包含令牌'312312'的内容:

findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1
Run Code Online (Sandbox Code Playgroud)

编辑: 更新函数在未找到时返回-1,因此它遵循与Array.prototype.indexOf()相同的构造

  • 不要这样做。学习如何使用高阶函数,这是旧的做事方式。 (4认同)
  • 对于那些对此解决方案有疑问的人,请记住===等号不仅会检查值,还会检查数据类型.因此,如果实际值是字符串,则比较日期,数字和空值可能会返回false.如果数据类型对您来说不重要,您可以使用==等号. (3认同)

eda*_*ank 19

var index = Data.findIndex(item => item.name == "John")
Run Code Online (Sandbox Code Playgroud)

这是一个简化版本:

var index = Data.findIndex(function(item){ return item.name == "John"})
Run Code Online (Sandbox Code Playgroud)

来自mozilla.org:

findIndex()方法返回数组中第一个满足提供的测试函数的元素的索引.否则返回-1.

  • 使用“===”进行字符串比较,这是此答案中唯一缺少的内容。 (2认同)

Ala*_* T. 15

如果您在使用IE时遇到问题,则可以使用9.0及更高版本支持的map()函数:

var index = Data.map(item => item.name).indexOf("Nick");
Run Code Online (Sandbox Code Playgroud)

  • [下面的答案](/sf/answers/1600537221/)提供了更多信息并首先发布。 (2认同)

And*_* D. 5

我知道的唯一方法是循环遍历所有数组:

var index = -1;
for(var i=0; i<Data.length; i++)
  if(Data[i].name === "John") {
    index = i;
    break;
  }
Run Code Online (Sandbox Code Playgroud)

或者不区分大小写:

var index = -1;
for(var i=0; i<Data.length; i++)
  if(Data[i].name.toLowerCase() === "john") {
    index = i;
    break;
  }
Run Code Online (Sandbox Code Playgroud)

结果变量索引包含对象索引,如果未找到则为 -1。