如何将多个元素移到数组的开头?

时间:2019-06-03 17:07:20

标签: javascript arrays sorting

我有一个将数组和字符串作为参数的函数。任务是检查字符串是否出现在函数内,并且是否移至数组的第一位。

warning: offsetof within non-standard-layout type ‘HWR<bitfield>’ is conditionally-supported [-Winvalid-offsetof]

在此示例中,所有披萨都必须移至数组的开头,而不考虑大写或小写字母。

4 个答案:

答案 0 :(得分:2)

您可以对数组进行排序并检查值,然后将其移到顶部。

function moveToFirstPlace(array, value) {
    return array.sort((a, b) => (b.toLowerCase() === value) - (a.toLowerCase() === value));
}

console.log(moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza'));

答案 1 :(得分:0)

执行此操作的一种方法是将name=PropertiesConfig #output folder property.filename=G:\\PRUEBAS property.packagename=com.package.main appenders=console, infoLoggerAppender, commonLoggerAppender, errorLoggerAppender appender.console.type=Console appender.console.name=STDOUT appender.console.layout.type=PatternLayout appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n #common appender appender.commonLoggerAppender.type=File appender.commonLoggerAppender.name=RollingFile appender.commonLoggerAppender.fileName=${filename}\\log.log appender.commonLoggerAppender.layout.type=PatternLayout appender.commonLoggerAppender.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n #error appender appender.errorLoggerAppender.type=RandomAccessFile appender.errorLoggerAppender.name=RandomAccessFile appender.errorLoggerAppender.fileName=${filename}\\error.log appender.errorLoggerAppender.layout.type=PatternLayout appender.errorLoggerAppender.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n #using LevelRangeFilter to only log error levels. appender.errorLoggerAppender.filter.threshold.type=LevelRangeFilter appender.errorLoggerAppender.filter.threshold.minLevel=error appender.errorLoggerAppender.filter.threshold.maxLevel=error #info appender appender.infoLoggerAppender.type=File appender.infoLoggerAppender.name=LOGFILE appender.infoLoggerAppender.fileName=${filename}\\info.log appender.infoLoggerAppender.layout.type=PatternLayout appender.infoLoggerAppender.layout.info=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n #using LevelRangeFilter to only log info levels. appender.infoLoggerAppender.filter.threshold.type=LevelRangeFilter appender.infoLoggerAppender.filter.threshold.minLevel=info appender.infoLoggerAppender.filter.threshold.maxLevel=info # creating only one logger, we can use this with multiple appenders. loggers=fileLogger # this is package name. This package and all of it's child packages will use this logger logger.fileLogger.name=${packagename} # logger base level logger.fileLogger.level=debug logger.fileLogger.appenderRefs=infoLoggerAppender, commonLoggerAppender, errorLoggerAppender logger.fileLogger.appenderRef.infoLoggerAppender.ref=LOGFILE logger.fileLogger.appenderRef.commonLoggerAppender.ref=RollingFile logger.fileLogger.appenderRef.errorLoggerAppender.ref=RandomAccessFile rootLogger.level=debug rootLogger.appenderRefs=stdout rootLogger.appenderRef.stdout.ref=STDOUT 应用于数组,一次用于标识匹配项,一次用于非匹配项。然后将两个结果串联起来:

filter

这将保持匹配元素的原始顺序。请注意,它不会更改原始数组,但会返回一个新数组作为结果。

您还可以在function moveToFirstPlace(arr, str) { str = str.toLowerCase(); const matches = arr.filter(elem => elem.toLowerCase() === str); const misses = arr.filter(elem => elem.toLowerCase() !== str); return matches.concat(misses); } var arr = moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza'); console.log(arr);中使用更具功能性的方法:

reduce

这两个解决方案都具有线性时间复杂度。

答案 2 :(得分:0)

您可以将function moveToFirstPlace(arr, str) { str = str.toLowerCase(); return arr.reduce((acc, elem) => (acc[+(elem.toLowerCase() === str)].push(elem), acc), [[], []]) .reduce((a, b) => a.concat(b)); } var arr = moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza'); console.log(arr);pushunshift一起使用来构建新数组。

toLowerCase()

答案 3 :(得分:0)

如果效率很重要,则可以通过运行一次/usr/local/Cellar/postgresql/11.3(不计算O(n))就地执行此操作,方法是从数组的两端开始运行索引,并在正确的索引找到披萨和左侧找到非披萨:

toLowerCase