2016-12-13 86 views
0

我有以下代碼:搜索使用ramda函數對象

const trimString = (s) => s.trim() 
const compareObjects = (o1, o2) => equals(o1, o2) 
const itemExists = (haystack, needle) => contains(haystack, needle) 

const objects = [ 
    { duration: '0.360000', name: 'Arthur', time: '0.660000', paragraph: 'p0-0' }, 
    { duration: '0.150000', name: 'the', time: '1.020000', paragraph: 'p0-0' }, 
    { duration: '0.380000', name: 'rat', time: '1.170000', paragraph: 'p0-0' }, 
    { duration: '0.770000', name: '.',  time: '1.550000', paragraph: 'p0-0' }, 
    { duration: '0.360000', name: 'Arthur', time: '89.820000', paragraph: 'p1-0' }, 
    { duration: '0.390000', name: 'stood', time: '90.180000', paragraph: 'p1-0' }, 
    { duration: '0.090000', name: 'and', time: '90.570000', paragraph: 'p1-0' } 
]; 

function searchFor(toSearch) { 
    var results = []; 
    toSearch = trimString(toSearch); // trim it 
    for(var i=0; i<objects.length; i++) { 
    for(var key in objects[i]) { 
     if(objects[i][key].indexOf(toSearch)!=-1) { 
     if(!itemExists(results, objects[i])) results.push(objects[i]); 
     } 
    } 
    } 
    return results; 
} 

log(searchFor('Arthur')) 

我得到的結果是:

[ 
    { 
     duration: '0.360000', 
     name: 'Arthur', 
     time: '0.660000', 
     paragraph: 'p0-0' 
    }, 
    { 
     duration: '0.360000', 
     name: 'Arthur', 
     time: '89.820000', 
     paragraph: 'p1-0' 
    } 
] 

但我被困在如何使之成爲一個ramda功能,並能夠將這種添加多個搜索項並僅顯示結果p0-0如果我使用Arthur the

任何建議是非常感謝。

+0

對我的要求有點不清楚。你真的想搜索對象的*每個*屬性嗎?也就是說,即使'{... time:'1.550000',...}'是唯一一個名字中帶有'。'的字符,如果您搜索了''。',您是否希望檢索自每個時間段和時間以來,每一條記錄都包含它 –

+0

然後也不清楚「亞瑟鼠」是否會匹配你的第一段,或只有連續的詞,如「亞瑟」,「亞瑟」,「亞瑟鼠」或「老鼠」 –

+0

此外,它看起來像儘管['String.prototype.trim'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)會替代你'trimString'函數和[ 'R.equals'](http://ramdajs.com/docs/#equals)儘管有些更強大,但可能會用於您的'compareObjects',給定您的數據。 –

回答

0

什麼可以幫助我接近功能風格時從最基本的要求慢慢地建立完整的規格。這些需求並不清楚,但看起來你想要返回一個匹配名稱的對象,並且可能擴展這個功能,這樣你就可以傳入一個名稱數組並返回一個對象數組。

因此,讓我們從最基本的要求開始,即根據名稱是否與給定參數匹配返回布爾值。爲此,我們將使用函數propEq

const nameEq = pred => R.propEq('name', pred) 

// This is just a partially application of: 
// const nameEq = pred => obj => R.propEq('name', pred)(obj) 

所以現在要在列表中找到匹配,我們使用功能filter將返回其評估爲true所提供的功能

的任何元素的所有對象
const nameInList = pred => R.filter(nameEq(pred)) 

// This is again a partial application of: 
// const nameInList = pred => obj => R.filter(nameEq(pred))(obj) 

這然後可以與

nameInList('Arthur')(objects) 

返回

稱爲
[ 
    { 
    "duration": "0.360000", 
    "name": "Arthur", 
    "paragraph": "p0-0", 
    "time": "0.660000" 
    }, 
    { 
    "duration": "0.360000", 
    "name": "Arthur", 
    "paragraph": "p1-0", 
    "time": "89.820000" 
    } 
] 

,或者我們可以部分地應用我們的功能

const findArthur = nameInList('Arthur') 

,後來在我們的對象

findArthur(objects) 
的名單通過

然後,我們可以更進一步定義扭轉參數:

const flipped = R.compose(R.curry, R.flip(R.uncurryN(2, nameInList))) 

然後這將允許我們將函數部分應用於objects,並通過傳入字符串來簡單地查找名稱。