javascript объект хеш vs lodash foreach в lodash удалить - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь удалить некоторые данные из сложного объекта.

Формат исходных данных следующий.

let originData = 
[
    {
       name : exampleDepth1,
       depth1Data : 
       [
            {
                 name : exampleDepth2,
                 depth2Data : 
                 [
                     {
                         code: 1234///will be delete from that data
                     },
                     ...
                 ]
            },
            ...
        ]
    },
    ....
]

let willbeDeletecode = [ 3, 100, 1234, 1000];

Имя удаляемого массива - это значение code в массиве depth2Data, равное originData, Имя удаляемого массива willbeDeletecode.

Извините, если вам было неудобно.

Я пытаюсь стереть это двумя способами.

let deleteBook = {}
_.forEach(willbeDeletecode, (deleteCode) => {
  deleteBook[`${deleteCode}`] = deleteCode;
})

_.remove(originData, (depth1) => {
  _.remove(depth1.depth1Data, (depth2) => {
    /*
    // delete with object hash
    _.remove(depth2.depth2Data, (eachDepth2Data) => {
      return deleteBook[eachDepth2Data.code] === undefined
    })
    */

    /*
    // delete with forEach
    let ret = false;
     _.remove(depth2.depth2Data, (eachDepth2Data) => {
       _.forEach(willbeDeletecode, (deleteCode) => {
         if(deleteCode === eachDepth2Data.code){
             ret = true;
             return false;
            }
        })
        return ret
    })
    */
    return depth2.depth2Data.length === 0;
  })
  return depth1.depth1Data.length === 0;
})

У меня есть два способа аннотировать каждый из них.

Первый - создать объект (deleteBook), вставить данные willbeDeletecode и использовать их для удаления lodash.

Второй метод - это полное сравнение с помощью функции forEach.

Вышеуказанный метод был повторен 1000 раз для сравнения. В результате первый метод составляет 100 ~ 200 мс, а второй - 500 ~ 700 мс.

Конечно, willbeDeletecode составляет около 10 или около того, но я думал, что хеш объекта был быстрее. Но результат оказался обратным.

Если в willbeDeletecode есть еще переменные, будет ли другой вывод? Я хочу знать, почему это приводит.

1 Ответ

0 голосов
/ 05 января 2019

Хеш объекта должен быть предпочтительным.Вы также можете использовать ES6 Set для этой цели.

Такое решение для хеширования должно быть быстрее.

Одна из причин, по которой вы не видели этого в вашем случае, заключается в том, что первый вариантвашего кода удаляет напротив того, что должно.Обратный вызов _remove должен возвращать истинное значение, когда соответствующий элемент должен быть удален, однако ваш код возвращает true, когда значение равно , а не в кодах, которые должны быть удалены.Вы должны использовать !== сравнение:

_.remove(depth2.depth2Data, (eachDepth2Data) => {
    return deleteBook[eachDepth2Data.code] !== undefined
})

Поскольку у вас был ===, у вас, вероятно, было намного больше удалений, что дало бы больше времени выполнения.

...