在对象数组中,查找属性与search匹配的对象的索引的最快方法
我一直在冲浪,试图find一个有效的方式来做到这一点,但没有得到任何好处。 我有一个像这样的对象数组:
array[i].id = some number; array[i].name = some name;
我想要做的是findid等于的对象的INDEXES,例如,0,1,2,3或4之一。我想我可以做一些事情:
var indexes = []; for(i=0; i<array.length; i++) { (array[i].id === 0) ? { indexes[0] = i } (array[i].id === 1) ? { indexes[1] = i } (array[i].id === 2) ? { indexes[2] = i } (array[i].id === 3) ? { indexes[3] = i } (array[i].id === 4) ? { indexes[4] = i } }
虽然这会起作用,但它看起来相当昂贵和缓慢(更不用说丑陋),特别是如果array.length可能很大。 任何想法如何把这个稍微调整一下? 我想使用array.indexOf不知何故,但我不知道如何强制的语法。 这个
array.indexOf(this.id === 0);
例如,返回未定义,因为它可能应该。 提前致谢!
也许你想使用更高级的function,如“地图”。 假设你想通过'field'属性search:
var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
新的数组方法.filter()将适用于此:
var filteredArray = array.filter(function (element) { return element.id === 0; });
jQuery也可以使用.grep()
编辑:值得一提的是,这两个函数只是在引擎盖下迭代,它们之间不会有明显的性能差异,并且滚动你自己的过滤函数,但为什么重新发明轮子。
在数组中find元素索引的最简单最容易的方法。
ES5语法: [{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
ES6语法: [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
array.forEach(function (elem, i) { // iterate over all elements of array indexes[elem.id] = i; // take the found id as index for the }); // indexes array and assign i
结果是id的查找列表。 用给定的id我们得到logging的索引。
var indices = []; var IDs = [0, 1, 2, 3, 4]; for(var i = 0, len = array.length; i < len; i++) { for(var j = 0; j < IDs.length; j++) { if(array[i].id == ID) indices.push(i); } }
听起来像你可以创build一个简单的迭代器与callbacktesting。 像这样:
function findElements(array, predicate) { var matchingIndices = []; for(var j = 0; j < array.length; j++) { if(predicate(array[j])) matchingIndices.push(j); } return matchingIndices; }
那么你可以这样调用:
var someArray = [ { id: 1, text: "Hello" }, { id: 2, text: "World" }, { id: 3, text: "Sup" }, { id: 4, text: "Dawg" } ]; var matchingIndices = findElements(someArray, function(item) { return item.id % 2 == 0; }); // Should have an array of [1, 3] as the indexes that matched
调整Tejs的答案mongoDB和Robomongo我改变了
matchingIndices.push(j);
至
matchingIndices.push(NumberInt(j+1));
使用ES6 map
function:
let idToFind = 3; let index = someArray.map(obj => obj.id).indexOf(idToFind);
由于没有使用常规数组find
答案:
var one = {id: 1, name: 'one'}; var two = {id: 2, name:'two'} var arr = [one, two] var found = arr.find((a) => a.id === 2) found === two // true arr.indexOf(found) // 1
总结上面的所有重要的答案和附加的我的答案有关查找所有索引发生的一些评论。
- 返回首次出现的索引。
const array = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 2 }]; const idYourAreLookingFor = 2; //ES5 //Output: 1 array.map(function (x) { return x.id; }).indexOf(idYourAreLookingFor); //ES6 //Output: 1 array.findIndex(obj => obj.id === idYourAreLookingFor);
由于我还不能评论,我想显示我使用的方法基于方法Umair Ahmed张贴,但是当你想要search一个键而不是一个值:
[{"a":true}, {"f":true}, {"g":false}] .findIndex(function(element){return Object.keys(element)[0] == "g"});
我明白它并不回答扩展的问题,但标题并没有具体说明每个对象所需要的,所以我想谦虚地分享这个来保存将来的其他人的头痛,而我不明白它可能不是最快的scheme。
我创build了一个名为super-array的小工具,您可以通过O(1)复杂度的唯一标识符访问数组中的项。 例:
const SuperArray = require('super-array'); const myArray = new SuperArray([ {id: 'ab1', name: 'John'}, {id: 'ab2', name: 'Peter'}, ]); console.log(myArray.get('ab1')); // {id: 'ab1', name: 'John'} console.log(myArray.get('ab2')); // {id: 'ab2', name: 'Peter'}
var test = [ {id:1, test: 1}, {id:2, test: 2}, {id:2, test: 2} ]; var result = test.findIndex(findIndex, '2'); console.log(result); function findIndex(object) { return object.id == this; }
将返回索引1(仅适用于ES 2016)