2016-10-07 8 views
2

私はクラスで「foo」を含むオブジェクト内の文字列に基づいてフィルタリングされた結果を返す関数(それが存在するかどう)フィルタリングされた値を取得するよりエレガントな方法?

let foo = nodes.reduce((arr, cur) => { 
    cur.classes.split(' ').filter((el) => { 
     if (el === 'foo') arr.push(cur) 
    }) 
    return arr; 
}, []); 

だから、それだけで、アレイ内のすべてのオブジェクトを返しますを持っているが、この1 オブジェクト例えば:

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'} 
] 

しかし、私の勇気は、その機能がより簡単かつ簡潔に書くことができると伝えます。何か案は?

答えて

4

ちょうど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);

0

クリーンではありませんが、パフォーマンスは向上します(このような単純な作業でパフォーマンスが重要な限り)。

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

また素敵なソリューション、あなたのトーマスに感謝。私はそれを保存します。 :) –

1

いつも@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));

+0

@NinaScholz、私は答えとして女性としてあなたを紹介しましたが、私は不快な前提をすることを意味しません。私が間違っている場合は私を修正してください^ _ ^ – naomik

関連する問題