如何通过javascript的属性来获取对象的索引
例如,我有:
var Data = [ {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'} ]
然后,我想按名称sorting/反转这个对象,例如。 我得到这样的东西:
var Data = [ {id_list:2,name:'John',token:'123123'},{id_list:1, name:'Nick',token:'312312'} ]
现在我想知道属性名称='John'的对象的索引来获取属性标记的值。
正如其他答案所示,循环访问数组可能是最好的方法。 但是我会把它放在它自己的function中,使它更加抽象:
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'} ];
有了这个,你不仅可以find哪一个包含“约翰”,但你可以find哪个包含令牌“312312”:
findWithAttr(Data, 'name', 'John'); // returns 0 findWithAttr(Data, 'token', '312312'); // returns 1 findWithAttr(Data, 'id_list', '10'); // returns -1
编辑:更新后的函数返回-1时没有find,所以它遵循与Array.prototype.indexOf()相同的结构
由于sorting部分已经回答。 我只是要提出另一种优雅的方式来获取您的数组中的属性的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很好。 数组现在具有findIndex函数。 这意味着你可以做这样的事情:
const index = Data.findIndex(item => item.name === 'John');
我所知道的唯一方法是遍历所有数组:
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;}
结果variables索引包含对象的索引,如果未find则返回-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.
你为什么不用一个小的解决办法?
创build一个名称为索引的新数组。 之后所有的search将使用索引。 所以,只有一个循环。 之后,你不需要遍历所有的元素!
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
活的例子。
您可以使用Array.sort使用自定义函数作为参数来定义您的sorting机制。
在你的例子中,它会给:
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之前,sorting函数必须返回-1,如果a应该在b之后,则返回1,如果两者相等,则返回0。 您可以在sorting函数中定义正确的逻辑来对数组进行sorting。
编辑:错过了你想知道索引的问题的最后部分。 像其他人所说的那样,你将不得不循环遍历数组。
只要通过你的arrays,find位置:
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
Chris Pickett的回答是因为在我的情况下,我需要search更深层的属性:
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。
除了德国的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 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; }
如果你有一个对象,里面有多个对象,如果你想知道某个对象是否包含在Master对象上,只要把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; });