[英]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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.