在所有键值对都是唯一的对象数组中查找对象



假设我有一个对象数组{key:string},其中所有键值对都是唯一的(不同对象中的键或值可以相同,但键值对相同(

const arr = [{a_1:"val_1"}, {a_2:"val_2"}, ..., {a_n:"val_n"}];

我有一个目标物体

const target = {a_i: "val_i"};

我想知道target是否存在于arr中,即它的键和值是否与arr中的某个对象匹配。如果为true,那么我希望返回arr中的对象。

示例:(已编辑(

const target = {foo: "bar"};
const arr = [{foo: "bar"}, {corona: "COVID-19"}, {foo: "notBar"}, {notFoo: "bar"}];

在本例中,在arr上搜索target将从arr返回{foo:"bar"}

注:

arr.find(ob => ob === target);

返回undefined。

这两个有不同的引用。也许有了JSON.stringify()就可以了。

const target = {foo: "bar"};
const arr = [{foo: "bar"}, {corona: "COVID-19"}];
const result = arr.find(ob => JSON.stringify(ob) === JSON.stringify(target));
console.log(result);

或者使用.every()的更好选项如下:

const target = {foo: "bar"};
const arr = [{foo: "bar"}, {corona: "COVID-19"}];
const keysT = Object.keys(target);
const result = arr.find(e => {
const keysE = Object.keys(e);

return keysE.length === keysT.length &&
keysE.every(k => e[k] === target[k])
});
console.log(result);

我希望这能有所帮助!

如果您的目标选项中有一个键/值对,您可以使用Array.prototype.some()查找源数组(直到找到匹配(,并使用Object.entries()提取目标键/值,如下所示:

const arr = [{a_1:"val_1"}, {a_2:"val_2"}, {a_n:"val_n"}],
target = {a_2: "val_2"},
[[targetKey, targetValue]] = Object.entries(target),

hasMatch = arr.some(item => targetKey in item && item[targetKey] == targetValue)

console.log(hasMatch)
.as-console-wrapper{min-height:100%;}

如果键不按顺序排列,就会执行此操作。但如果目标对象的键值本身存在对象,则不会。

const target = {foo: "bar"};
const arr = [{foo: "bar"}, {corona: "COVID-19"}];
arr.find(ob => {
for (key in target) {
if (!(key in ob)) return false;
if (ob[key] !== target[key]) return false;
}
return true;
});

编辑:
对于"密钥未按顺序排列",我的意思是:

const target = {foo: "bar", bar: "foo"};
const arr = [{bar: "foo", foo: "bar"}, {corona: "COVID-19", foo: "bar"}];

最新更新