簡體   English   中英

在對象中使用ramda函數進行搜索

[英]Search using ramda functions in object

我有以下代碼:

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函數,並且能夠添加多個搜索項,並且僅在使用Arthur the顯示p0-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 ,該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並通過傳入字符串來簡單地查找名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM