比较ramda.js中的部分对象

Jim*_*Jim 5 javascript ramda.js

有一个等于函数Ramdajs这是完全真棒,它会提供下列资料:

// (1) true
R.equals({ id: 3}, { id: 3})

// (2) true
R.equals({ id: 3, name: 'freddy'}, { id: 3, name: 'freddy'})

// (3) false
R.equals({ id: 3, name: 'freddy'}, { id: 3, name: 'freddy', additional: 'item'});
Run Code Online (Sandbox Code Playgroud)

我将如何增强此功能,或以其他方式产生true数字结果3

我想忽略所有属性的的rValue中不存在lValue,但比较忠实地休息.我希望equals保持完整的递归性质- 如果可能的话.

我做了一个简单的小提琴,显示了上面的结果.

Sco*_*her 7

equals为了能够很好地适应需要保持对称性的Fantasy Land规范,有一个限制equals(a, b) === equals(b, a),所以为了满足你的情况我们需要将对象变成一些等效的形状进行比较.

我们可以通过创建第二个对象的新版本来实现这一目标,该第二个对象已删除了第一个对象中不存在的所有属性.

const intersectObj = (a, b) => pick(keys(a), b)

// or if you prefer the point-free edition
const intersectObj_ = useWith(pick, [keys, identity])

const a = { id: 3, name: 'freddy' },
      b = { id: 3, name: 'freddy', additional: 'item'}

intersectObj(a, b) // {"id": 3, "name": "freddy"}
Run Code Online (Sandbox Code Playgroud)

使用它,我们现在可以根据第一个对象中存在的属性比较两个对象a.

const partialEq = (a, b) => equals(a, intersectObj(a, b))

// again, if you prefer it point-free
const partialEq_ = converge(equals, [identity, intersectObj])

partialEq({ id: 3, person: { name: 'freddy' } },
          { id: 3, person: { name: 'freddy' }, additional: 'item'})
//=> true

partialEq({ id: 3, person: { name: 'freddy' } },
          { id: 3, person: { age: 15 }, additional: 'item'})
//=> false
Run Code Online (Sandbox Code Playgroud)


ipl*_*s26 0

我之前没有使用过 Ramda.js,所以如果我的回答有问题,请随时指出。

我学习了Ramda.js的源码

src/equals.js中,是定义您使用的函数的位置。

var _curry2 = require('./internal/_curry2');
var _equals = require('./internal/_equals');

module.exports = _curry2(function equals(a, b) {
  return _equals(a, b, [], []);
});
Run Code Online (Sandbox Code Playgroud)

所以它只是将函数equals(内部称为_equals)放入“curry”中。

那么让我们检查一下内部函数,它确实检查了第 84~86_equals行的长度:

if (keysA.length !== keys(b).length) {
  return false;
}
Run Code Online (Sandbox Code Playgroud)

只需注释这些行,它就会true如您所愿。


您可以 1) 只需在 Ramda 的分布式版本中注释这 3 行,或者 2) 您可以向partialEquals其中添加您自己的函数,然后重新构建并创建您的 Ramda 版本(从我的角度来看,这是更推荐的)。如果您需要任何帮助,请随时与我讨论。:)