javascript 中的 Defaultdict 等价物

新手上路,请多包涵

在 python 中,您可以使用 defaultdict(int) 将 int 存储为值。如果您尝试对字典中不存在的键进行“获取”,您将获得零作为默认值。

你能在 javascript/jquery 中做同样的事情吗

原文由 user462455 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 353
1 个回答

您可以使用 JavaScript 构建一个 Proxy

 var defaultDict = new Proxy({}, {
  get: (target, name) => name in target ? target[name] : 0
})

这使您可以在访问属性时使用与普通对象相同的语法。

 defaultDict.a = 1
console.log(defaultDict.a) // 1
console.log(defaultDict.b) // 0

为了稍微清理一下,您可以将其包装在构造函数中,或者使用类语法。

 class DefaultDict {
  constructor(defaultVal) {
    return new Proxy({}, {
      get: (target, name) => name in target ? target[name] : defaultVal
    })
  }
}

const counts = new DefaultDict(0)
console.log(counts.c) // 0

编辑: 上面的实现只适用于原语。它也应该通过将构造函数作为默认值来处理对象。这是一个应该与原语和构造函数类似的实现。

 class DefaultDict {
  constructor(defaultInit) {
    return new Proxy({}, {
      get: (target, name) => name in target ?
        target[name] :
        (target[name] = typeof defaultInit === 'function' ?
          new defaultInit().valueOf() :
          defaultInit)
    })
  }
}

const counts = new DefaultDict(Number)
counts.c++
console.log(counts.c) // 1

const lists = new DefaultDict(Array)
lists.men.push('bob')
lists.women.push('alice')
console.log(lists.men) // ['bob']
console.log(lists.women) // ['alice']
console.log(lists.nonbinary) // []

原文由 Andy Carlson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏