首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更优雅的获得过滤值的方法?

更优雅的获得过滤值的方法?
EN

Stack Overflow用户
提问于 2016-10-07 22:11:50
回答 3查看 95关注 0票数 2

我有一个函数,它根据对象中的字符串返回过滤后的结果(如果存在或不存在)

代码语言:javascript
运行
复制
let foo = nodes.reduce((arr, cur) => {
    cur.classes.split(' ').filter((el) => {
        if (el === 'foo') arr.push(cur)
    })
    return arr; 
}, []);

因此,它只是返回数组中包含类对象中“foo”的所有对象,例如:

代码语言:javascript
运行
复制
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'}
]

但我的勇气告诉我,这个函数可以更容易、更简洁地编写。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-07 22:15:48

你可以只用Array#filter

代码语言:javascript
运行
复制
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);

票数 5
EN

Stack Overflow用户

发布于 2016-10-08 06:45:51

按照通常的做法,@NinaScholz提供了一个非常好的、直接的方法。你就该听从她的建议了。

我个人喜欢进一步剖析这些问题,并演示如何将更小的、可重用的功能组合起来,以达到预期的效果。我希望这个答案能帮助您看到,JavaScript中的函数式编程可以轻松地扩展到内置原型方法之外。

注释帮助您理解类型,但完全是可选的。

代码语言: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));

票数 1
EN

Stack Overflow用户

发布于 2016-10-07 23:11:41

作为“过滤部分”的替代方案,正如尼娜所示,这是一种略有不同的方法。

看上去没那么干净,但表现得更好(就性能而言,这是一项简单的任务)。

代码语言:javascript
运行
复制
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 '));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39926499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档