使 Underscorejs 函数在生成器上运行

Make Underscorejs functions functioning on generators

我有几十个作用于数组的函数。为了便于说明,请参阅 here

如您所见,我在大多数操作中使用 Underscorejs

但是我想在我的主要迭代器上写一个转换,它是一个 JSON 对象的列表,如下所示:

var listings = [{ title: 'title1', d: 0, desc: 'hello world', pass: 'qub7s1ya', tags: ["tag1", "tag2"] }]

因为我想真正优化性能,所以我想在 desc 值上写一个转换器。为此,我将使用 lzutf8;这样我就只在磁盘和内存中存储压缩值。在每个 Underscorejs 操作中,我想对键 desc.

的解压缩值进行操作

显然,Underscore 操作不会直接作用于生成器,所以我的问题是如何实现这一点?

Edit1:我相信 Underscorejs 的所有操作都是顺序的,那么为什么不支持生成器呢?还是我遗漏了什么?

Edit2:这些操作是作用于 JSON 对象或类似

的数组中的“键值”的操作

_#filter, _#findWhere, _#where, _#reject, _#pick

起初,我想到生成器能够在运行时更改每个项目,以便能够从压缩项目中获得纯文本。同样(我认为至少现在),它可以通过将计算的 属性 附加到 JSON 对象来实现,这在 JavaScript 中是可能的。类似于:

var item = {
    desc: "compressed text", 
}

Object.defineProperty(item, 'desc_', {
  get: function() { return decompress(this.desc) }
});
console.log(item.desc_)
console.log(JSON.parse(JSON.stringify(item)))

那我不用担心作用于desc的其他函数,只需将desc替换为desc_即可。

显然,使用 Object.defineProperty 添加函数不会影响 JSON.stringify,这与使用 getter 重新定义另一个 JSON 相反:

var item = {
    desc: "hello world", 
    get desc_(){ return (this.desc.toUpperCase()); },
    toJSON() {
      return {
        desc: this.desc 
      }
  }
}

其中必须定义 toJSON,否则将计算并保留 desc_(出于某种原因!)。

回到Underscore.js问题。所有需要的操作似乎都适用于新计算的 属性.

其中的示例:

listings = [{ title: 'title1', d: 0, desc: 'oipfjezojifze', pass: 'qub7s1ya', tags: ["tag1", "tag2"] }]
listings.forEach(item => {
    Object.defineProperty(item, 'desc_', {
        get: function () { return (this.desc.toUpperCase()) }
    });
});
var results = _.where(listings, { desc_: "oipfjezojifze".toUpperCase() })
// it also returns the object intact
console.log(results[0].desc_)
// and other methods _#filter, _#findWhere, _#where, _#reject, _#pick do as well