我有一个这样的数组:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
我怎么能得到对象的索引,匹配的条件,而不是在整个数组上迭代?
例如,给定prop2=="yutu",我想获得索引1。
我看到过. indexof(),但认为它用于简单的数组,如["a1","a2",…]。我还检查了$.grep(),但这返回对象,而不是索引。
我有一个这样的数组:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
我怎么能得到对象的索引,匹配的条件,而不是在整个数组上迭代?
例如,给定prop2=="yutu",我想获得索引1。
我看到过. indexof(),但认为它用于简单的数组,如["a1","a2",…]。我还检查了$.grep(),但这返回对象,而不是索引。
当前回答
最好和最快的方法是:
const products = [
{ prop1: 'telephone', prop2: 996 },
{ prop1: 'computadora', prop2: 1999 },
{ prop1: 'bicicleta', prop2: 995 },
];
const index = products.findIndex(el => el.prop2 > 1000);
console.log(index); // 1
其他回答
我怎么能得到对象的索引匹配的条件(没有迭代沿数组)?
你不能,某些东西必须遍历数组(至少一次)。
如果条件变化很大,则必须遍历并查看其中的对象,以确定它们是否与条件匹配。然而,在一个带有ES5特性的系统上(或者如果你安装了一个shim),这个迭代可以相当简单地完成:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
它使用了新的(ish) array# some函数,该函数循环遍历数组中的条目,直到您赋予它的函数返回true。我给它的函数保存匹配条目的索引,然后返回true以停止迭代。
当然,也可以使用for循环。您的各种迭代选项都包含在另一个答案中。
但如果你总是要使用相同的属性进行查找,如果属性值是唯一的,你可以只循环一次,并创建一个对象来映射它们:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(或者,同样,您可以使用for循环或任何其他选项。)
然后如果你需要找到prop2 = "yutu"的条目,你可以这样做:
var entry = prop2map["yutu"];
我称之为“交叉索引”数组。当然,如果您删除或添加条目(或更改它们的prop2值),您也需要更新映射对象。
使用Array.reduce()的一个步骤-没有jQuery
var items = [{id: 331}, {id: 220}, {id: 872}];
var searchIndexForId = 220;
var index = items.reduce(function(searchIndex, item, index){
if(item.id === searchIndexForId) {
console.log('found!');
searchIndex = index;
}
return searchIndex;
}, null);
如果没有找到索引,将返回null。
使用Array.map()和Array.indexOf(string)
const arr = [{ 提案 1: “ABC”, 提案2:“QWE” }, { 提案 1: “bnmb”, 提案2:“玉兔” }, { 提案1:“ZXVZ”, 提案2:“QWRQ” }] const index = arr.map(i => i.prop2).indexOf(“yutu”); 控制台.log(索引);
为什么不进行迭代呢?新的Array.prototype.forEach非常适合这个目的!
如果需要,可以使用二叉搜索树通过单个方法调用进行查找。这是一个整洁的实现的BTree和红黑搜索树在JS - https://github.com/vadimg/js_bintrees -但我不确定你是否能同时找到索引。
从2016年开始,你应该使用Array。findIndex (ES2015/ES6标准)用于:
a = [ {prop1 " abc " prop2 qwe "} ", {prop1 bnmb "、" prop2 yutu "}, " {prop1 zxvz "、" prop2 qwrq "} "]; index = a.f ndindex (x => x.p rp2 ==="yutu"); console.log (index);
支持谷歌Chrome, Firefox和Edge。对于ie浏览器,在链接页面上有一个填充。
性能报告
函数调用是非常昂贵的,因此对于非常大的数组,一个简单的循环将比findIndex执行得更好:
let test = []; for (let i = 0; i < 1e6; i++) test.push({prop: i}); let search = test.length - 1; let count = 100; console.time('findIndex/predefined function'); let fn = obj => obj.prop === search; for (let i = 0; i < count; i++) test.findIndex(fn); console.timeEnd('findIndex/predefined function'); console.time('findIndex/dynamic function'); for (let i = 0; i < count; i++) test.findIndex(obj => obj.prop === search); console.timeEnd('findIndex/dynamic function'); console.time('loop'); for (let i = 0; i < count; i++) { for (let index = 0; index < test.length; index++) { if (test[index].prop === search) { break; } } } console.timeEnd('loop');
与大多数优化一样,这应该在实际需要时谨慎应用。