Javascript:在数组中查找对象的索引,不知道索引,只知道对象
Javascript: Finding an object's index in an array, not knowing the index, only the object
我有一个对象数组,我想删除其中一个对象。
[
{"field":"ingredients","gte":"egg","lte":"egg"},
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"},
{"field":"ingredients","gte":"hvetemel","lte":"hvetemel"}
]
我不知道我要删除的对象的索引,但我知道整个对象。即:
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}
我需要通过它的全部内容(所有属性)找到对象的索引,而不仅仅是通过field
, gte
或lte
。我如何找到对象的索引在数组与纯JavaScript?
您可以遍历数据,然后检查键和每个键的长度,如果它具有相同的内容。
var data = [{ "field": "ingredients", "gte": "egg", "lte": "egg" }, { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }],
search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" },
keys = Object.keys(search),
index = -1;
data.some(function (a, i) {
if (Object.keys(a).length === keys.length && keys.every(function (k) { return a[k] === search[k]; })) {
index = i;
return true;
}
});
console.log(index);
ES6
var data = [{ "field": "ingredients", "gte": "egg", "lte": "egg" }, { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }],
search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" },
keys = Object.keys(search),
index = data.findIndex(a =>
Object.keys(a).length === keys.length && keys.every(k => a[k] === search[k]));
console.log(index);
您可以使用Object.keys()
, Array.prototype.findIndex()
, Array.prototype.every()
检查每个属性名称,值和.length
对象属性名称是否相等。
let data = [
{"field":"ingredients","gte":"egg","lte":"egg"},
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"},
{"field":"ingredients","gte":"hvetemel","lte":"hvetemel"}
];
let props = {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"};
let keys = Object.keys(props);
let index = data.findIndex(o => keys.every(key => o[key] === props[key])
&& Object.keys(o).length === keys.length);
console.log(index);
根据您的进一步评论,您只需要针对这种特定情况的解决方案,其中对象由3个给定属性组成。因此,我建议使用以下ES6解决方案:
var data = [
{ "field": "ingredients", "gte": "egg", "lte": "egg" },
{ "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" },
{ "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }];
var search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" };
var index = data.findIndex(
a => a.field == search.field && a.gte == search.gte && a.lte == search.lte);
console.log(index);
如果你没有完整的ES6支持,那么:
var data = [
{ "field": "ingredients", "gte": "egg", "lte": "egg" },
{ "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" },
{ "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }];
var search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" };
var index = -1;
data.some(function (a, i) {
if (a.field == search.field && a.gte == search.gte && a.lte == search.lte)
return index = i, true;
});
console.log(index);
您可以使用此代码解决您的问题
var array = [
{"field":"ingredients","gte":"egg","lte":"egg"},
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"},
{"field":"ingredients","gte":"hvetemel","lte":"hvetemel"}
];
var searchObject =
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"};
var indexOfSearchResult;
for (var i = 0; i < array.length; i++) {
var checkEqualBool = true;
for (var key in array[i]) {
if(array[i][key]!=searchObject[key]){
checkEqualBool = false;
break;
}
}
if(checkEqualBool){
indexOfSearchResult = i;
break;
}
}
我使用老方法比较对象,通过字符串化它。试着复习一下这个
var x = [{
"field": "ingredients",
"gte": "egg",
"lte": "egg"
}, {
"field": "ingredients",
"gte": "bakepulver",
"lte": "bakepulver"
}, {
"field": "ingredients",
"gte": "hvetemel",
"lte": "hvetemel"
}];
var control = {
"field": "ingredients",
"gte": "bakepulver",
"lte": "bakepulver"
};
function getIndex(arr, key) {
var got = false,
result = -1;
arr.every(function(e, i) {
if (JSON.stringify(e) === JSON.stringify(key)) {
console.log('match found');
result = i;
return false;
}
return true;
})
return result;
}
console.log(getIndex(x, control));
相关文章:
- 在JavaScript中通过索引从对象数组中获取值
- Javascript:根据对象的嵌套数组中的值,在数组中查找对象的索引
- “未定义的索引:itemdetails”,当将JSON对象从JavaScript发送到PHP时
- 在知道对象值的情况下,确定数组中JS对象的索引
- 索引IndexedDB中对象中的数组值
- 对象中的索引错误
- 按键查找数组中对象的索引
- 使用Handlebars获取同级JSON数据,其中单个对象没有父索引键,但多个项有一个索引键
- 最新typescript编译器版本(0.9.5)中的可索引对象
- jQuery按索引不一致的值筛选对象
- 对象的角度ng重复索引
- 如何将数组的对象与同一索引组合
- 在Javascript中,有没有一种方法可以用一个语句创建一个索引对象数组
- 如何从 0 开始重新索引对象
- JavaScript - 将两个数组对象合并为一个arr对象,然后遍历每个索引/对象
- Javascript数组索引对象
- 我可以在mongo查询中索引对象吗?
- IndexedDB:索引对象值
- 查找javascript的索引"对象数组"基于对象字段值
- 在javascript中创建两个数组的字符串索引对象