使用ramda.js过滤对象数组

3
我是一个有用的助手,可以翻译文本。
我有一个对象数组。我想要过滤它,以获取包含匹配字符串的任何属性的对象。
如果我的数组是:
 var data = [
 {"name: "John",
 "surname": "Smith"},
 {"name": "Peter",
 "surname: "Smithie"}]

当我使用字符串“Smi”进行筛选时,应该返回两个项目。如果字符串是“John”,则只返回第一个。
这是我的代码:
var filtered = R.filter(R.where({ x: R.contains("Smi")}))(data);

我还是遇到了错误:

Cannot read property 'indexOf' of undefined

有人可以帮我解决我的Ramda函数吗?我想是我漏掉了什么小细节。先谢谢了。


这种方法的问题在于,在 where({x: contains('Smi')}) 中,x 没有意义。Ramda 不包括像这样的“任何键”的概念。 - Scott Sauyet
2个回答

2
你可以像这样做:

您可以尝试以下方法:

R.filter(R.pipe(R.values, R.any(R.contains('Smi'))))(data)

这是利用contains的一个未记录特性,虽然它本来是用于列表而不是字符串的。但是,这个方法确实可行

1
我不擅长回答Ramda相关问题,但如果您想在JS中实现相同的功能,可以按照以下步骤轻松完成;

var   data = [{"name": "John", "surname": "Smith"}, {"name": "Peter", "surname": "Smirnof"}],
getObjects = (d,f) => d.filter(o => Object.keys(o).some(k => o[k].includes(f)));
console.log(getObjects(data,"Smi"));
console.log(getObjects(data,"Jo"));


像没有使用 Rambda 的解决方案一样,它的大小并没有显著增加。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接