有没有一种简单的方法(希望使用ES6+)可以将突变应用于基于配置对象的数组值



我正在尝试编写一个函数,该函数允许我配置数组值。我想创建配置对象,比如:

var words = [
'spacejump',
'apples',
'graphics',
'javascript',
'peaches'
];
var configs = [{
upper_case:'first',
length:[6,8]
},{
upper_case:'last',
length:[7,9],
strip:'vowels'
},{
length:10,
strip:'consonants'
}]

然后将这些配置应用于另一个字符串数组(在这种情况下为单词)并输出结果,如下所示:

[
[
"Apples",
"Graphics",
"Peaches"
],
[
"spcjmP",
"grphcS",
"pchS"
],
[
"aai"
]
]

我很难开始,因为我试图过滤结果,但进入新的单个数组。

function configurate(config) {
for (var filter in config) {
switch (filter) {
case upper_case:
//capitalize either first or last letter
case length:
//include words with said length
case strip:
//strip vowels or consonants
}
}
}
function applyConfig(array, configs) {
//forEach() word in array apply config
//this is where I am confused a bit,
//
//
}

这就是我到目前为止所做的,我遗漏了太多的实施,因为我担心我没有有效地做到这一点。

您可以使用lambda函数创建配置操作,并将这些操作包含在配置对象中。

现在,您可以在configs数组上循环,对于每个符合配置长度要求的单词,将所有函数应用到它

下面是一个示例实现。在很多方面可能会做得更好,但我认为这符合你的意愿。

var words = [
'spacejump',
'apples',
'graphics',
'javascript',
'peaches'
];
const config_functions = {
upper_case: {
first: s => s[0].toUpperCase() + s.slice(1),
last: s => s.slice(0, s.length - 1) + s[s.length - 1].toUpperCase()
},
strip: {
vowels: s => s.replace(/[aeiou]/ig,''),
consonants: s => s.replace(/[bcdfghjklmnpqrstvxz]/ig,'')
},
range: (s, ...range) => range[1] ? (s.length >= range[0] && s.length <= range[1]) : s.length >= range[0]
};
var configs = [{
modifiers: [
config_functions.upper_case.first
],
length: s => config_functions.range(s,6,8)
},{
modifiers: [
config_functions.upper_case.last,
config_functions.strip.vowels
],
length: s => config_functions.range(s,7,9)
},{
modifiers: [
config_functions.strip.consonants
],
length: s => config_functions.range(s,10)
}];
let res = configs.map(config => words
.filter(word => config.length(word))
.map(word => config.modifiers.reduce((acc, func) => acc = func(acc), word)));
console.log(res);

最新更新