是否可以更改项目内的 属性 和项目本身的 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 , 和其他人。