Искать в массивах как свойства объекта и возвращать соответствующий ключ - PullRequest
0 голосов
/ 28 ноября 2018

Привет, ребята. Я пытаюсь найти более чистый и надежный способ выполнить эту задачу.

Допустим, у меня есть объектный вызов total

const total = { 
                toDevice: [{'a':'a'},{'b':'b'},], 
                fromDevice: [{'c':'c'},{'c':'c'},]
               };

и я предполагаю, чтоклонируя массивы toDevice и fromDevice следующим образом

const copiedArr = [...total.toDevice, ...total.fromDevice]

Я получаю ссылку на объект внутри этого массива copiedArr.

const a = copiedArr[1];

, затем я хочувыполните поиск, чтобы получить соответствующий ключ для ссылки внутри объекта total.

Например, если я ищу a, он должен вернуть строку toDevice

Вот решение, которое я нашел

Object.keys(total).filter(key => {
  return total[key].indexOf(a) !== -1;
})[0]

Недумаю, что это лучший подход.Ребята, есть ли у вас лучшие решения?

1 Ответ

0 голосов
/ 28 ноября 2018

Поскольку из исходного вопроса мне не было ясно, хотите ли вы сопоставить ключи или значения в дочерних массивах, я написал один пример для каждого варианта использования:

const total = { 
  toDevice: [{ a: 1 }, { b: 2 }], 
  fromDevice: [{ c: 3 }, { d: 4 }]
}

const matchKey = (needle, haystack) => (
  Object.entries(total).find(
    ([key, value]) => value.some(item => Object.keys(item).includes(needle))
  ) || []
)[0]

console.log(matchKey('a', total))

const matchValue = (needle, haystack) => (
  Object.entries(total).find(
    ([key, value]) => value.some(item => Object.values(item).includes(needle))
  ) || []
)[0]

console.log(matchValue(4, total))

Учитывая ваше последующее редактирование и разъяснение проблемы, я бы предложил что-то вроде этого:

const total = { 
  toDevice: [{'a':'a'},{'b':'b'}], 
  fromDevice: [{'c':'c'},{'c':'c'}]
}

const a = [...total.toDevice, ...total.fromDevice][1]

const matchObject = (needle, haystack) => (
  Object.entries(haystack).find(
    ([key, value]) => value.includes(needle)
  ) || []
)[0]

console.log(matchObject(a, total))

Примечания:

  1. Object.entries более эргономичен, чем Object.keys для этого варианта использования.
  2. Array.prototype.find сокращает итерацию по массиву, как только найдено совпадение (в отличие от Array.prototype.filter, который всегда будет повторяться по всему массиву).
  3. Array.prototype.includes почти всегда более эргономичен, чем Array.prototype.indexOf.

Документы:

Object.prototype.entries

Array.prototype.find

Array.prototype.some

Array.prototype.includes

...