Вы можете сначала получить патчи, а затем отфильтровать заданный ключ, если он больше, чем в двух, и отфильтровать это значение.
function filter(source, targets) {
function getPath(array, target) {
return array.reduce((r, { key, children }) => {
var temp;
if (key === target) return r.concat(key);
if (children) {
temp = getPath(children, target);
if (temp.length) return r.concat(key, temp);
}
return r;
}, [])
}
var temp = targets.map(k => getPath(source, k));
return targets.filter(v => !temp.some((c => a => a.includes(v) && ++c)(-1)));
}
var array = [{ key: 1, title: 'aa', children: [{ key: 2, title: 'bb', children: [{ key: 3, title: 'cc', children: [{ key: 5, title: 'ee', children: [{ key: 6, title: 'ff' }, { key: 7, title: 'gg' }, { key: 8, title: 'hh' }] }] }, { key: 4, title: 'dd', }] }] }],
result = filter(array, [1, 2, 3, 4, 8]);
console.log(result);
В соответствии с Windows (протестированный с XP), можно создать .cmd файл и просто иметь его, запускает программу Perl с аргументом %1 для передавания имени файла, как будто выполняемый командной строкой.
perl c:\test.pl %1
Затем можно просто перетащить файл на .cmd файл для выполнения.
Eeek! Не создавайте обертку script/cmd, когда Вы не должны будете.
Войдите в свой Реестр или свое диалоговое окно File Type в Windows, и переопределите действие значения по умолчанию Perl для высказывания:
"C:\path-to-perl-folders\perl.exe" "%1" %*
Это заставит двойной щелчок по.PL запускать perl.exe с названием файла (%1), по которому дважды щелкают. % * материал (передающий любые аргументы имени файла сценарию Perl) более хитер.
Войдите в Реестр снова (действительно, это не столь страшно, как люди думают), и найдите/создайте "shellex" ключ под классом Perl и затем создайте подраздел под названием "DropHandler" со строковым значением по умолчанию "{86C86720-42A0-1069-A2E8-08002B30309D}" (по крайней мере, это - мой DropHandler в американской версии Windows XP).
Это позволяет .pl файлам (на самом деле, что-либо связанное с классом Perl) иметь обработчик отбрасываний, который говорит Проводник, что сделать, когда Вы отбрасываете файл (файлы) на .pl сценарии. В этом случае это просто означает, "запускает скрипт Perl с перемещаемым файлом (файлами) как аргументы".
Хм, я не думаю, что объяснил, что очень хорошо, но это - то, как я настроил Perl (убегающий сетевой диск) для крупной технической организации. Google для Perl и DropHandler, и необходимо смочь заставить .reg сценарий Реестра делать это для Вас.
Вот еще одна альтернатива «оболочке», но она требует небольшой модификации сценария perl:
@SETLOCAL ENABLEEXTENSIONS
@c: \ path \ to \ perl.exe -x "% ~ f0"% *
@exit / b% ERRORLEVEL%
#! Perl
#line 6
# ... здесь продолжается сценарий perl ...
Этот сценарий запускается как любой другой пакетный файл. Первые три строки в основном вызывают Perl для самого файла CMD (% ~ f0
, который работает, только если включены расширения CMD). Параметр -x
для perl.exe указывает Perl пропускать все до строки #! Perl
. « #line 6
» просто помогает при отладке.
Это мое предпочтительное решение, когда я не