Как я требую, чтобы пользователь удалил предыдущую версию с NSIS

  1. Фильтрация массива с помощью Array#filter
  2. Преобразование элементов массива в тип по вашему выбору с использованием Array#map

var data = [{"score": "1200.65", "num_games": "160", "wins": "110", "year": "2013" }, { "score": "705.23", "num_games": "34", "wins": "21", "year": "2014" }, { "score": "467.12", "num_games": "77", "wins": "30", "year": "2015" }];

function getFilteredData(data, start, end) {
  return data.filter(function(item) {
    return +start <= +item.year && +item.year <= +end;
  }).map(function(item) {
    return {
      x: item.year,
      y: item.score
    };
  });
}

console.log(getFilteredData(data, 2014, 2017));

Если ваши даты находятся в разумных пределах, вам не нужно конвертировать год в number, но любые 3–5-значные годы не будут фильтроваться должным образом, если вы не конвертируете годы в числа.

Если вы хотите более абстрактную версию функции, вы можете сделать:

var data = [{"score": "1200.65", "num_games": "160", "wins": "110", "year": "2013" }, { "score": "705.23", "num_games": "34", "wins": "21", "year": "2014" }, { "score": "467.12", "num_games": "77", "wins": "30", "year": "2015" }];

function getFilteredData(data, filterOptions, mapOptions) {
  return data.filter(function(item) {
    return Object.keys(filterOptions).every(function(key) {
      var option = filterOptions[key];
      if (+option.min <= +item[key] && +item[key] <= +option.max) return true;
    });
  }).map(function(item) {
    return Object.keys(mapOptions).reduce(function(result, key) {
      var option = mapOptions[key];
      result[key] = item[option];
      return result;
    }, {});
  });
}

function registerFilter(filterOptions, mapOptions) {
  return function(data) {
    return getFilteredData(data, filterOptions, mapOptions);
  };
}

var customFilter = registerFilter(
  { year: { min: 2014, max: 2015 },
  { x: "year", y: "score" }
);

console.log(customFilter(data));

Вы можете сделать обе операции вместе используя петлю for или Array#reduce. Что делает код более быстрым, но менее обслуживаемым.

var data = [{"score": "1200.65", "num_games": "160", "wins": "110", "year": "2013" }, { "score": "705.23", "num_games": "34", "wins": "21", "year": "2014" }, { "score": "467.12", "num_games": "77", "wins": "30", "year": "2015" }];

function getFilteredData(data, start, end) {
  return data.reduce(function(result, item) {
    if (+start <= +item.year && +item.year <= +end) result.push({
      x: item.year,
      y: item.score
    });
    return result;
  }, []);
}

console.log(getFilteredData(data, 2014, 2017));

10
задан Nifle 15 May 2010 в 08:25
поделиться

2 ответа

NSIS является большой Windows Installer. Вот то, как я использую NSIS для удаления текущей версии при установке новой версии того же приложения. Добавьте следующую функцию к своему сценарию NSIS.

Function .onInit

         Exec $INSTDIR\uninst.exe 

FunctionEnd

Также можно проверить эту ссылку на Wiki NSIS на "Автоудалении, старом прежде, чем установить новый".

13
ответ дан 3 December 2019 в 15:53
поделиться

Другой подход - создать скрытый раздел UninstallPrevious и заставить его запускаться раньше всех остальных разделов в программе установки. Я также предлагаю запустить программу удаления в автоматическом режиме.

; The "" makes the section hidden.
Section "" SecUninstallPrevious

    Call UninstallPrevious

SectionEnd

Function UninstallPrevious

    ; Check for uninstaller.
    ReadRegStr $R0 HKLM "${HKLM_REG_KEY}" "InstallDir"

    ${If} $R0 == ""        
        Goto Done
    ${EndIf}

    DetailPrint "Removing previous installation."    

    ; Run the uninstaller silently.
    ExecWait '"$R0\Uninstall.exe /S"'

    Done:

FunctionEnd

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

Конечно, в зависимости от ваших потребностей вы можете захотеть, чтобы пользователь подтвердил удаление, и в этом случае используйте подход spinner_den .

13
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: