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

2020/10/10 12:41 · javascript ·  · 0评论

例如,我有:

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

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

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

现在,我想知道具有属性的对象的索引,name='John'以获取属性标记的值。

我该如何解决这个问题?

正如其他答案所暗示的那样,遍历数组可能是最好的方法。但是我会把它放在它自己的函数中,并使它更抽象一些:

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'}
];

这样,不仅可以找到包含“ John”的标记,还可以找到包含标记“ 312312”的标记:

findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1

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

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

您的示例是:

var Data = [
    {id_list:1, name:'Nick',token:'312312'},
    {id_list:2,name:'John',token:'123123'}
]

你可以做:

var index = Data.map(function(e) { return e.name; }).indexOf('Nick');

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

这就是ES6和arrow语法,它更简单:

const index = Data.map(e => e.name).indexOf('Nick');

如果您适合使用ES6。数组现在具有findIndex函数。这意味着您可以执行以下操作:

const index = Data.findIndex(item => item.name === 'John');
var index = Data.findIndex(item => item.name == "John")

这是以下内容的简化版本:

var index = Data.findIndex(function(item){ return item.name == "John"})

来自mozilla.org:

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

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

var index = Data.map(item => item.name).indexOf("Nick");

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

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

或不区分大小写:

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

在结果变量索引上包含对象的索引;如果未找到,则包含-1。

原型方式

(function(){
  if (!Array.prototype.indexOfPropertyValue){
    Array.prototype.indexOfPropertyValue = function(prop,value){
      for (var index = 0; index < this.length; index++){
        if (this[index][prop]){
          if (this[index][prop] == value){
            return index;
          }
        }
      }
      return -1;
    }
  }
 })();
 // usage:
 var Data = [
 {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}];
 Data.indexOfPropertyValue('name','John'); // returns 1 (index of array);
 Data.indexOfPropertyValue('name','Invalid name') // returns -1 (no result);
 var indexOfArray = Data.indexOfPropertyValue('name','John');
 Data[indexOfArray] // returns desired object.

您可以使用Array.sort,并使用自定义函数作为参数来定义排序机制。

在您的示例中,它将给出:

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]

Data.sort(function(a, b){
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});

alert("First name is : " + Data[0].name); // alerts 'John'
alert("Second name is : " + Data[1].name); // alerts 'Nick'

如果a应该在b之前,sort函数必须返回-1,如果a应该在b之后,则返回1,如果两者相等则返回0。由您决定在排序函数中定义正确的逻辑以对数组进行排序。

编辑:错过了您想知道索引的问题的最后一部分。您将不得不遍历数组以找到其他人所说的。

只需遍历数组并找到位置:

var i = 0;
for(var item in Data) {
    if(Data[item].name == 'John')
        break;
    i++;
}
alert(i);

这可能有用

function showProps(obj, objName) {  
  var result = "";  
  for (var i in obj)  
    result += objName + "." + i + " = " + obj[i] + "\n";  
  return result;  
}

https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects复制

您为什么不使用一个小的解决方法?

创建一个以名称为索引的新数组。之后,所有搜索将使用索引。因此,只有一个循环。之后,您无需遍历所有元素!

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
    ]
var searchArr = []
Data.forEach(function(one){
  searchArr[one.name]=one;
})
console.log(searchArr['Nick'])

http://jsbin.com/xibala/1/edit

现场例子。

扩展了Chris Pickett的答案,因为在我的情况下,我需要搜索的深度不止一个属性级别:

function findWithAttr(array, attr, value) {
  if (attr.indexOf('.') >= 0) {
    var split = attr.split('.');
    var attr1 = split[0];
    var attr2 = split[1];
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr1][attr2] === value) {
        return i;
      }
    }
  } else {
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr] === value) {
        return i;
      }
    }
  };
};

您可以将“ attr1.attr2”传递给函数

那这个呢 ?

Data.indexOf(_.find(Data, function(element) {
  return element.name === 'John';
}));

假设您正在使用lodash或underscorejs。

var fields = {
teste:
{
    Acess:
    {
        Edit: true,
      View: false

      }
 },
teste1:
{
    Acess:
    {
        Edit: false,
      View: false

      }
  }
};

console.log(find(fields,'teste'));
function find(fields,field){
    for(key in fields){
        if(key == field){
        return true;
    }
}
return false;
}

如果您有一个内部包含多个对象的对象,如果您想知道某个对象是否包含在主对象中,只需将find(MasterObject,'Object to Search')放进去,此函数将返回响应(如果存在或不存在)(TRUE或FALSE) ),希望对此有所帮助,可以在JSFiddle上看到
示例

let indexOf = -1;
let theProperty = "value"
let searchFor = "something";

theArray.every(function (element, index) {

    if (element[theProperty] === searchFor) {
        indexOf = index;
        return false;
    }
    return true;
});
collection.findIndex(item => item.value === 'smth') !== -1

如果要获取属性令牌的值,则也可以尝试此操作

    let data=[
      { id_list: 1, name: 'Nick', token: '312312' },
      { id_list: 2, name: 'John', token: '123123' },
    ]

    let resultingToken =  data[_.findKey(data,['name','John'])].token

_.findKey是lodash的函数

除了German Attanasio Ruiz的答案,您还可以使用Array.reduce()而不是Array.map()消除第二个循环。

var Data = [
    { name: 'hypno7oad' }
]
var indexOfTarget = Data.reduce(function (indexOfTarget, element, currentIndex) {
    return (element.name === 'hypno7oad') ? currentIndex : indexOfTarget;
}, -1);

使用下划线:

var index = _.indexOf(_.pluck(item , 'name'), 'Nick');
本文地址:http://javascript.askforanswer.com/ruhezaijavascriptzhongtongguoduixiangdeshuxinghuoqusuoyin.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!