Если вы не возражаете против изменения дерева параметров на месте , это должно сработать. Обратите внимание, что он вернет null
, если вы попытаетесь удалить корень.
const tree = { id: 1, name: "Dog", parent_id: null, children: [ { id: 2, name: "Food", parent_id: 1, children: [] }, { id: 3, name: "Water", parent_id: 1, children: [ { id: 4, name: "Bowl", parent_id: 3, children: [] }, { id: 5, name: "Oxygen", parent_id: 3, children: [] }, { id: 6, name: "Hydrogen", parent_id: 3, children: [] } ] } ] };
const removeFromTree = (root, nameToDelete, parent, idx) => {
if (root.name === nameToDelete) {
if (parent) {
parent.children.splice(idx, 1);
}
else return null;
}
for (const [i, e] of root.children.entries()) {
removeFromTree(e, nameToDelete, root, i);
}
return tree;
};
console.log(removeFromTree(tree, "Oxygen"));
Ваш текущий код находится на правильном пути. Однако:
newTree = curNode.children.slice(index, index + 1);
выдвигает на первый план несколько проблем: нам нужно манипулировать массивом children
родителя, чтобы удалить curNode
вместо собственного children
массива [116]. Я передаю родительские объекты и дочерний индекс рекурсивно через вызовы, избавляя от проблем линейной операции findIndex
.
Кроме того, разрезание от index
до index + 1
извлекает только один элемент и не изменяет curNode.children
. Не очевидно, как использовать newArray
или возвращать его через стек вызовов. splice
кажется более подходящим инструментом для решения поставленной задачи: извлечение одного элемента на месте.
Обратите внимание, что эта функция удалит несколько записей, соответствующих nameToDelete
.
MD5 - разумный алгоритм для обнаружения изменений в наборе данных. Однако, если вас не интересуют криптографические свойства, и вы очень заинтересованы в производительности алгоритма, вы можете использовать более простой алгоритм в стиле контрольной суммы, который не предназначен для криптографической защиты. (хотя недостатки MD5 были обнаружены в последние годы, он по-прежнему разработан для криптографической защиты и, следовательно, выполняет больше работы, чем может потребоваться для вашего сценария).
Однако, если вы довольны вычислительной производительностью MD5 Я бы просто придерживался этого.
То, что вы делаете, звучит довольно хорошо для меня.
Если емкость на стороне сервера дешева и минимизирует сеть использование имеет решающее значение, чтобы каждый клиент мог помнить, каким был его последний набор данных, и отправлять только различия (в виде списка вставок, удалений и правок) по каждому запросу. Если вы сначала отсортируете строки данных, эти различия могут быть достаточно эффективно рассчитаны с использованием алгоритма дифференцирования, например, используемого в diff
.
Этот подход чувствителен к перебоям в работе сети - если один ответ не получен клиентом ошибки будут накапливаться. Однако это можно исправить, отправив клиенту хэш MD5 с каждым запросом: если он отличается от того, что ожидает сервер, будет отправлен весь список вместо списка изменений.
MD5 просто отлично. Если он имеет слишком низкую производительность, вы можете попробовать быстрый алгоритм контрольной суммы, такой как, например, Adler-32 .
Я согласен с ответом Джонатана относительно MD5. Что касается альтернативных способов обнаружения изменений, если вы хотите сохранить (или уже сохранили) на сервере время / дату самого последнего изменения, вы можете передать это назад и вперед клиенту. Вы полностью избегаете вычислений и даже можете использовать большую часть существующего кода.
-
BMB
Я думаю, что любая обычно используемая хеш-функция будет делать то, что вы хотите - обеспечить уникальное представление сущности.
Для решения проблемы, которую вы пытаетесь решить, моим решением было бы иметь внутреннюю таблицу, в которой записываются все изменения. Не сами изменения, а идентификатор строк, которые изменились. Периодически вызывайте сервер и получайте список всех объектов, которые были изменены, и используйте его для определения клиентом, какие строки необходимо обновить / удалить / добавить.