Как я могу найти индекс по ключу и значению в объекте (но это полностью объект без массива) - PullRequest
0 голосов
/ 08 февраля 2020

Я возвращаю данные ниже со стороны сервера laravel.

  response = {
    "1": {
      "id": 1,
      "title": "Port1",
      "code": "P",
      "accounting_code": "119"
    },
    "2": {
      "id": 2,
      "title": "Port2",
      "code": "P2",
      "accounting_code": "120"
    },
    "4": {
      "id": 4,
      "title": "Port3",
      "code": "P3",
      "accounting_code": "122"
    },
    "5": {
      "id": 5,
      "title": "Port4",
      "code": "P4",
      "accounting_code": "123"
    }
  }

Ответ здесь не меняется, даже когда я превращаю коллекцию в массив (toArray ()). Поэтому я должен обработать это, но когда я использую этот код, например:

response.findIndex( p => p.code == 'P1') // or .find() or .indexOf()

, я получаю ошибку findIndex is not a function. Я знаю, что это должен быть массив объектов , чтобы использовать эту функцию, но должен быть простой способ легко обработать этот laravel ответ на лету. Я имею в виду использование встроенных ответных сигналов, без каких-либо преобразований.

Я думаю (наверняка), что я упускаю здесь большую концепцию, которую я не смог обнаружить (реализовать) в Интернете, просто погуглив.

1 Ответ

2 голосов
/ 08 февраля 2020

Превратите объект в массив записей (запись представляет собой пару ключ-значение, как массив), и затем вы можете использовать .find для этого массива. Если запись соответствует условию, вы можете извлечь из нее ключ (или значение, или индекс):

const response = {
  "1": {
    "id": 1,
    "title": "Port1",
    "code": "P",
    "accounting_code": "119"
  },
  "2": {
    "id": 2,
    "title": "Port2",
    "code": "P2",
    "accounting_code": "120"
  },
  "4": {
    "id": 4,
    "title": "Port3",
    "code": "P3",
    "accounting_code": "122"
  },
  "5": {
    "id": 5,
    "title": "Port4",
    "code": "P4",
    "accounting_code": "123"
  }
};
const entry = Object.entries(response).find(([, obj]) => obj.code === 'P3');
if (entry) {
  console.log(entry[0]);
}

Если вас не интересует соответствующий ключ или значение, просто индекс, затем возьмите Object.values, чтобы получить массив, и вызовите findIndex для него :

const response = {
  "1": {
    "id": 1,
    "title": "Port1",
    "code": "P",
    "accounting_code": "119"
  },
  "2": {
    "id": 2,
    "title": "Port2",
    "code": "P2",
    "accounting_code": "120"
  },
  "4": {
    "id": 4,
    "title": "Port3",
    "code": "P3",
    "accounting_code": "122"
  },
  "5": {
    "id": 5,
    "title": "Port4",
    "code": "P4",
    "accounting_code": "123"
  }
};
const index = Object.values(response).findIndex(obj => obj.code === 'P3');
console.log(index);

Но код обычно не должен зависеть от ключей объектов определенного порядка. Несмотря на то, что порядок определен c, он может быть несколько запутанным, и числовые ключи c, такие как 1 и 5, могут быть «упорядочены» внутри объекта только в порядке возрастания числительных c. Если вам действительно нужен индекс, вам следует рассмотреть возможность изменения серверной части для отправки массива объектов вместо одного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...