比较类实例与私有属性的相等性

问题描述 投票:0回答:1

如何创建一个具有私有属性的类,以便在将任意 2 个实例与私有属性中的不同项进行比较时,lodash

isEqual
返回 false?

例如,在以下代码中

isEqual
比较具有不同项目的 Bobcat 类的 2 个实例会产生
true
。我想要
false
。是否缺少任何 Map 方法或其他什么?

const _ = require('lodash')

class Bobcat {
  #items;

  constructor() {
    this.#items = new Map()
  }

  set(key, value) {
    return this.#items.set(key, value)
  }

  get(key) {
    return this.#items.get(key)
  }

  has(key) {
    return this.#items.has(key)
  }

  delete(key) {
    return this.#items.delete(key)
  }

  clear() {
    this.#items.clear()
  }

  keys() {
    return this.#items.keys()
  }

  values() {
    return this.#items.values()
  }

  entries() {
    return this.#items.entries()
  }

  forEach(callbackFn, thisArg) {
    return this.#items.forEach(callbackFn, thisArg)
  }

  [Symbol.iterator]() {
    return this.#items[Symbol.iterator]()
  }
}

const cat1 = new Bobcat()
cat1.set('a', 1)

const cat2 = new Bobcat()
cat2.set('a', 2)

console.log(_.isEqual(cat1, cat2))
// true

另一个要求是在课外进行比较。类本身不应添加比较方法。例如,我不想

class Bobcat {
  isEqual(otherCat) {
    ... 
  }
}

或任何特定于 lodash 的功能,例如

class Bobcat {
  [Symbol.for('lodash.isEqual')](otherCat) {
    ... 
  }
}
javascript lodash
1个回答
1
投票

自定义

toStringTag
返回
Map
为我解决了这个问题,而无需更改 isEqual 比较的下游代码。

  get [Symbol.toStringTag]() {
    return 'Map'
  }

完整代码

const _ = require('lodash')

class Bobcat {
  #items

  constructor() {
    this.#items = new Map()
  }

  set(key, value) {
    return this.#items.set(key, value)
  }

  get(key) {
    return this.#items.get(key)
  }

  has(key) {
    return this.#items.has(key)
  }

  delete(key) {
    return this.#items.delete(key)
  }

  clear() {
    this.#items.clear()
  }

  keys() {
    return this.#items.keys()
  }

  values() {
    return this.#items.values()
  }

  entries() {
    return this.#items.entries()
  }

  forEach(callbackFn, thisArg) {
    return this.#items.forEach(callbackFn, thisArg)
  }

  [Symbol.iterator]() {
    return this.#items[Symbol.iterator]()
  }

  get size() {
    return this.#items.size
  }

  get [Symbol.toStringTag]() {
    return 'Map'
  }
}

const cat1 = new Bobcat()
cat1.set('a', 1)

const cat2 = new Bobcat()
cat2.set('a', 1)

// true
console.log('equal1', _.isEqual(cat1, cat2))

cat2.set('a', 2)

// false
console.log('equal2', _.isEqual(cat1, cat2))

© www.soinside.com 2019 - 2024. All rights reserved.