Reputation: 331
I have an array of objects and I want to remove one of the objects.
[
{"field":"ingredients","gte":"egg","lte":"egg"},
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"},
{"field":"ingredients","gte":"hvetemel","lte":"hvetemel"}
]
I don't know the index of the object I want to remove, but I know the whole object. I.e:
{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}
I need to find the object's index by it's full content (all properties), not just by field
, gte
or lte
. How do I find object's index in the array with just plain JavaScript?
Upvotes: 2
Views: 171
Reputation: 350272
As I understand from your further comments, you need a solution for this specific case only, where the objects consist of 3 given properties. Therefore I would suggest this ES6 solution:
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);
If you don't have full ES6 support, then:
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);
Upvotes: 1
Reputation: 1725
I use old method of comparing object, by stringify it. try to review this one
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));
Upvotes: 0
Reputation: 386578
You could iterate over the data and then check the length of the keys and every key, if it has the same content.
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);
Upvotes: 2
Reputation: 86
You could use this code for your problem
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;
}
}
Upvotes: 0
Reputation: 1
You can use Object.keys()
, Array.prototype.findIndex()
, Array.prototype.every()
to check if each property name, value, and object property names .length
are equal.
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);
Upvotes: 2