我有一个函数,它根据对象中的字符串返回过滤后的结果(如果存在或不存在)
let foo = nodes.reduce((arr, cur) => {
cur.classes.split(' ').filter((el) => {
if (el === 'foo') arr.push(cur)
})
return arr;
}, []);因此,它只是返回数组中包含类对象中“foo”的所有对象,例如:
let nodes = [
{node: 'h1', classes: 'foo'},
{node: 'p', classes: 'bar'},
{node: 'p', classes: 'baz xxx'},
{node: 'h2', classes: 'bar baz foo'},
{node: 'ul', classes: 'poop foo'}
]但我的勇气告诉我,这个函数可以更容易、更简洁地编写。有什么想法吗?
发布于 2016-10-07 22:15:48
你可以只用Array#filter。
let nodes = [{node: 'h1', classes: 'foo'}, {node: 'p', classes: 'bar'}, {node: 'p', classes: 'baz xxx'}, {node: 'h2', classes: 'bar baz foo'}, {node: 'ul', classes: 'poop foo'}],
foo = nodes.filter(a => a.classes.split(' ').some(b => b === 'foo'));
console.log(foo);
发布于 2016-10-08 06:45:51
按照通常的做法,@NinaScholz提供了一个非常好的、直接的方法。你就该听从她的建议了。
我个人喜欢进一步剖析这些问题,并演示如何将更小的、可重用的功能组合起来,以达到预期的效果。我希望这个答案能帮助您看到,JavaScript中的函数式编程可以轻松地扩展到内置原型方法之外。
注释帮助您理解类型,但完全是可选的。
// comp :: (b -> c) -> (a -> b) -> (a -> c)
const comp = f => g => x => f (g (x));
// filter :: (a -> Boolean) -> [a] -> [a]
const filter = f => xs => xs.filter(f);
// some :: (a -> Boolean) -> [a] -> Boolean
const some = f => xs => xs.some(f);
// eq :: (String a, Number a) => a -> a -> Boolean
const eq = x => y => y === x;
// nodeClasses :: Node -> [String]
const nodeClasses = ({classes}) => classes.split(' ');
// nodesWithClass :: String -> [Node] -> [Node]
const nodesWithClass = c => filter (comp (some (eq (c))) (nodeClasses));
// nodes :: [Node]
let nodes = [
{node: 'h1', classes: 'foo'},
{node: 'p', classes: 'bar'},
{node: 'p', classes: 'baz xxx'},
{node: 'h2', classes: 'bar baz foo'},
{node: 'ul', classes: 'poop foo'}
];
console.log(nodesWithClass('foo') (nodes));
发布于 2016-10-07 23:11:41
作为“过滤部分”的替代方案,正如尼娜所示,这是一种略有不同的方法。
看上去没那么干净,但表现得更好(就性能而言,这是一项简单的任务)。
let nodes = [
{node: 'h1', classes: 'foo'},
{node: 'p', classes: 'bar'},
{node: 'p', classes: 'foo-bar'},
{node: 'p', classes: 'baz xxx'},
{node: 'h2', classes: 'bar baz foo'},
{node: 'ul', classes: 'poop foo'}
];
let foo = nodes.filter(node => (' ' + node.classes + ' ').contains(' foo '));https://stackoverflow.com/questions/39926499
复制相似问题