我有一个这样的数组:
[{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(),但这返回对象,而不是索引。
当前回答
试试这段代码
var x = [{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"}]
let index = x.findIndex(x => x.prop1 === 'zxvz')
其他回答
var list = [
{prop1:"abc",prop2:"qwe"},
{prop1:"bnmb",prop2:"yutu"},
{prop1:"zxvz",prop2:"qwrq"}
];
var findProp = p => {
var index = -1;
$.each(list, (i, o) => {
if(o.prop2 == p) {
index = i;
return false; // break
}
});
return index; // -1 == not found, else == index
}
我怎么能得到对象的索引匹配的条件(没有迭代沿数组)?
你不能,某些东西必须遍历数组(至少一次)。
如果条件变化很大,则必须遍历并查看其中的对象,以确定它们是否与条件匹配。然而,在一个带有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值),您也需要更新映射对象。
我在上面看到了很多解决方案。
在这里,我使用map函数在数组对象中查找搜索文本的索引。
我将用学生数据来解释我的答案。
步骤1:为学生创建数组对象(可选,您可以创建自己的数组对象)。 学生var =[{名称:“Rambabu htno: " 1245 "},{名称:“迪”,htno: " 1246 "},{名称:“poojitha htno: " 1247 "},{名称:“magitha htno: " 1248 "}); 步骤2:创建变量搜索文本 var studentNameToSearch =“Divya”; 步骤3:创建变量来存储匹配的索引(这里我们使用map函数进行迭代)。 var matchedIndex = students。Map(函数(obj){返回obj.name;}) .indexOf (studentNameToSearch);
学生var =[{名称:“Rambabu htno: " 1245 "},{名称:“迪”,htno: " 1246 "},{名称:“poojitha htno: " 1247 "},{名称:“magitha htno: " 1248 "}); var studentNameToSearch =“Divya”; var matchedIndex = students。Map(函数(obj){返回obj.name;}) .indexOf (studentNameToSearch); console.log (matchedIndex); alert("你的搜索名称索引在数组中是:"+matchedIndex)
使用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。
function findIndexByKeyValue(_array, key, value) {
for (var i = 0; i < _array.length; i++) {
if (_array[i][key] == value) {
return i;
}
}
return -1;
}
var a = [
{prop1:"abc",prop2:"qwe"},
{prop1:"bnmb",prop2:"yutu"},
{prop1:"zxvz",prop2:"qwrq"}];
var index = findIndexByKeyValue(a, 'prop2', 'yutu');
console.log(index);