Найти объект в массиве объектов, где все пары ключ-значение являются уникальными - PullRequest
3 голосов
/ 24 марта 2020

Скажем, у меня есть массив объектов {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"}];

В этом примере поиск target в arr вернет {foo:"bar"} из arr.

Примечание:

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

возвращает неопределенное значение.

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

Эти 2 имеют разные ссылки. Может быть, с 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);

Надеюсь, это поможет!

1 голос
/ 24 марта 2020

Если в вашем целевом параметре есть одна пара ключ / значение, вы можете использовать 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%;}
1 голос
/ 24 марта 2020

, что сделает это, если ключи не в порядке. Но не в том случае, если ключевые значения объектов целевого объекта сами по себе.

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"}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...