繁体   English   中英

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"}

我需要通过对象的全部内容(所有属性)而不是通过fieldgtelte来查找对象的索引。 如何仅使用普通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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM