Лучший подход к поиску в данных с использованием JS / NodeJS - PullRequest
0 голосов
/ 19 июня 2020

Если у меня есть файл JSON, содержащий огромный данные выглядят так

    {
                  "completed": true,
                  "completions": [
                    {
                  "id": 123,
                  "lead_time": 111,
                  "result": [
                    {

                      "id": "FQAWeIOlNO",
                      "value": {
                        "text": "some text for test"
                      }
                    }
                  ]
                }
              ],
              "data": {
                "url": "www.example.com/1_123_4.wav"
              },
              "id": 123
       }

мой код будет примерно таким:

arr.forEach((obj) => { //arr contains all the data from JSON

  id = obj.id
  let repeated = obj.data.url.replace('www.example.com/', '').split('.wav')
  fileName = repeated[0]
// here i want to make the search.
    }

так Я получаю доступ к URL-адресу через forEach l oop и получаю filenName.wav .

Я хочу пройтись по всем URL-адресам и проверить, существует ли другой URL-адрес с одно и то же имя .wav или не так каждый раз, когда мне нужно взять один .wav из URL-адреса и l oop через все другие URL-адреса, это займет время O (N ^ 2), которое будет отнимает много времени, так как у меня слишком много данных.

Я обнаружил, что могу использовать объекты для этого подхода и поиска в них, но я не мог понять, как они будут работать, или как я буду искать в них . Насколько я понимаю, объекты всегда переопределяются, поэтому я хочу так часто их использовать (не знаю, правильно ли это).

Если кто-то знает лучший подход, это было бы более чем приветствуем, и если кто-то может направить мне, если Objects - решение, за которое я был бы благодарен.

1 Ответ

0 голосов
/ 19 июня 2020

Результат может быть достигнут за время O (n) с использованием объектов, используя имя файла в качестве ключа и массив в значении. При зацикливании проверьте объект, существует ли ключ; если это так, pu sh URL-адрес массива.

let arr = [
    {
      "completed": true,
      "completions": [{
        "id": 123,
        "lead_time": 111,
        "result": [{

          "id": "FQAWeIOlNO",
          "value": {
            "text": "some text for test"
          }
        }]
      }],
      "data": {
        "url": "www.example.com/1_123_4.wav"
      },
      "id": 123
    },
    {
      "completed": true,
      "completions": [{
        "id": 124,
        "lead_time": 111,
        "result": [{

          "id": "FQAWeIOlNO",
          "value": {
            "text": "some text for test"
          }
        }]
      }],
      "data": {
        "url": "www.example1.com/1_123_4.wav"
      },
      "id": 124
    },
    {
      "completed": true,
      "completions": [{
        "id": 125,
        "lead_time": 111,
        "result": [{

          "id": "FQAWeIOlNO",
          "value": {
            "text": "some text for test"
          }
        }]
      }],
      "data": {
        "url": "www.example.com/123_4.wav"
      },
      "id": 125
    }
]

let segregateByFile = arr.reduce((obj,rec) => {
        let url = rec.data.url
        let urlSplit = url.split('/')
        let fileName = urlSplit[urlSplit.length - 1]
        obj[fileName] = obj[fileName] || []
        obj[fileName].push(url)
        return obj
      },{})
      
console.log(segregateByFile)

приведенный выше код вернет объект с именем файла в качестве ключа и значением в виде массива URL-адресов. Вы можете проверить, сколько раз файл повторяется, проверив длину и легко перебирая массив, чтобы проверить URL-адрес, который файл повторяется в

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