使 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
我有几十个作用于数组的函数。为了便于说明,请参阅 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