是否可以更改项目内的 属性 和项目本身的 return?
Is possible to change a property inside a item and return the item itself?
我的应用程序中有这样的代码
var name = 'TesT';
var nameLowercase = name && name.toLowerCase (),
namesToTest = ['asd', 'asd1', 'TesT'];
var findCorrectName = R.pipe(
R.map(R.toLower),
R.any(R.equals(nameLowercase))
);
var hasFoundName = findCorrectName (namesToTest);
return hasFoundName;
但是,现在我需要在对象列表中进行搜索,并且 属性 'name' 必须小写。当找到与我的搜索相匹配的对象时,我需要获取它。
我已阅读文档,但找不到解决方案。
var name = 'TesT';
var nameLowercase = name && name.toLowercase (),
namesToTest = [ { name : 'asd', otherProperties... },
{ name : 'asd1', otherProperties... },
{ name : 'TesT', otherProperties... }];
var findByCorrectName = R.pipe(
R.map(
R.pipe(R.prop('name'), R.toLower)),
R.find(R.propEq('name', nameLowercase))
);
var foundObject = findByCorrectName (namesToTest);
return foundObject;
我找到了 function over,这正是我需要的。
var name = 'TesT',
nameLowercase = name && name.toLowerCase(),
namesToTest = [ { name : 'asd' },
{ name : 'asd1' },
{ name : 'TesT' }];
var findByCorrectName = R.pipe(
R.map(R.over(R.lensProp('name'), R.toLower)),
R.find(R.propEq('name', nameLowercase))
);
var hasFoundName = findByCorrectName (namesToTest);
return hasFoundName;
我认为这是解决您问题的直接方法:
const items = [{name : 'asd', x: 1}, {name : 'asd1', x: 2}, {name : 'TesT', x: 3}];
const byNameCi = curry((name, items) => find(
where({name: pipe(toLower, equals(toLower(name)))}),
items,
));
byNameCi('TEST', items); //=> {name: "TesT", x: 3}
您的用例可能不需要 curry
,但它也允许这样做:
const findAsd = byNameCi('Asd');
// later
findAsd(items); //=> {name: "asd", x: 1}
请注意,这 return 是您的原始值,没有进行 toLowerCase 转换。如果你想 return 那些有转换名称的,那么我可能会这样改变它:
const byTransformedNameCi = curry((name, items) => find(
where({name: pipe(toLower, equals(toLower(name)))}),
map(evolve({name: toLower}), items),
));
byTransformedNameCi('TEST', items); //=> {name: "test", x: 3}
或者,如您所说,使用 lensProp
and over
instead of evolve
。
虽然制作这些 point-free 是可能的,但它们已经相当可读了,所以我看不出花任何精力在上面的充分理由。
您可以在 Ramda REPL.
上看到这些方法
您在标题中询问了关于转换 属性 和 returning object 的问题。 Ramda 实际上不会改变你的数据;如果您正在寻找它,Ramda 不适合您。但是它将 return 一个新的 object 和 属性 转换,并且它有许多功能以各种方式执行此操作,包括我们已经提到的 assoc
, adjust
, 和其他人。
我的应用程序中有这样的代码
var name = 'TesT';
var nameLowercase = name && name.toLowerCase (),
namesToTest = ['asd', 'asd1', 'TesT'];
var findCorrectName = R.pipe(
R.map(R.toLower),
R.any(R.equals(nameLowercase))
);
var hasFoundName = findCorrectName (namesToTest);
return hasFoundName;
但是,现在我需要在对象列表中进行搜索,并且 属性 'name' 必须小写。当找到与我的搜索相匹配的对象时,我需要获取它。
我已阅读文档,但找不到解决方案。
var name = 'TesT';
var nameLowercase = name && name.toLowercase (),
namesToTest = [ { name : 'asd', otherProperties... },
{ name : 'asd1', otherProperties... },
{ name : 'TesT', otherProperties... }];
var findByCorrectName = R.pipe(
R.map(
R.pipe(R.prop('name'), R.toLower)),
R.find(R.propEq('name', nameLowercase))
);
var foundObject = findByCorrectName (namesToTest);
return foundObject;
我找到了 function over,这正是我需要的。
var name = 'TesT',
nameLowercase = name && name.toLowerCase(),
namesToTest = [ { name : 'asd' },
{ name : 'asd1' },
{ name : 'TesT' }];
var findByCorrectName = R.pipe(
R.map(R.over(R.lensProp('name'), R.toLower)),
R.find(R.propEq('name', nameLowercase))
);
var hasFoundName = findByCorrectName (namesToTest);
return hasFoundName;
我认为这是解决您问题的直接方法:
const items = [{name : 'asd', x: 1}, {name : 'asd1', x: 2}, {name : 'TesT', x: 3}];
const byNameCi = curry((name, items) => find(
where({name: pipe(toLower, equals(toLower(name)))}),
items,
));
byNameCi('TEST', items); //=> {name: "TesT", x: 3}
您的用例可能不需要 curry
,但它也允许这样做:
const findAsd = byNameCi('Asd');
// later
findAsd(items); //=> {name: "asd", x: 1}
请注意,这 return 是您的原始值,没有进行 toLowerCase 转换。如果你想 return 那些有转换名称的,那么我可能会这样改变它:
const byTransformedNameCi = curry((name, items) => find(
where({name: pipe(toLower, equals(toLower(name)))}),
map(evolve({name: toLower}), items),
));
byTransformedNameCi('TEST', items); //=> {name: "test", x: 3}
或者,如您所说,使用 lensProp
and over
instead of evolve
。
虽然制作这些 point-free 是可能的,但它们已经相当可读了,所以我看不出花任何精力在上面的充分理由。
您可以在 Ramda REPL.
上看到这些方法您在标题中询问了关于转换 属性 和 returning object 的问题。 Ramda 实际上不会改变你的数据;如果您正在寻找它,Ramda 不适合您。但是它将 return 一个新的 object 和 属性 转换,并且它有许多功能以各种方式执行此操作,包括我们已经提到的 assoc
, adjust
, 和其他人。