Array#filter
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));
NSIS является большой Windows Installer. Вот то, как я использую NSIS для удаления текущей версии при установке новой версии того же приложения. Добавьте следующую функцию к своему сценарию NSIS.
Function .onInit
Exec $INSTDIR\uninst.exe
FunctionEnd
Также можно проверить эту ссылку на Wiki NSIS на "Автоудалении, старом прежде, чем установить новый".
Другой подход - создать скрытый раздел 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 .