如何将Underscore.js过滤器与对象一起使用
How to use Underscore.js filter with an object?
我有一个这样的对象:
> Object
> Rett@site.com: Array[100]
> pel4@gmail.com: Array[4]
> 0
id : 132
selected : true
> 1
id : 51
selected : false
等等。。
如何使用下划线_.filter()
仅返回选定===true的项目?
我从来没有必要使用_.filter()
深入到各个层次。类似的东西
var stuff = _.filter(me.collections, function(item) {
return item[0].selected === true;
});
感谢
如果您想从selected
为true
的任何电子邮件地址中提取所有数组元素,您可以这样迭代:
var selected = [];
for (email in emailLists) {
selected.concat(_.filter(emailLists[email], function (item) {
return item.selected === true;
}));
}
如果您只想提取所有元素都是selected
的数组,那么您可以执行以下操作:
var stuff = _.filter(me.collections, function(item) {
return _.all(item, function (jtem) {
jtem.selected === true;
});
});
Undercore的filter方法将处理用作哈希或字典的对象,但它将返回对象的可枚举值数组并去掉键。我需要一个函数来根据哈希值过滤哈希,以保留密钥,并在Coffeescription:中写道
hash_filter: (hash, test_function) ->
keys = Object.keys hash
filtered = {}
for key in keys
filtered[key] = hash[key] if test_function hash[key]
filtered
如果你没有使用Coffeescript,下面是Javascript中的编译结果,稍微清理一下:
hash_filter = function(hash, test_function) {
var filtered, key, keys, i;
keys = Object.keys(hash);
filtered = {};
for (i = 0; i < keys.length; i++) {
key = keys[i];
if (test_function(hash[key])) {
filtered[key] = hash[key];
}
}
return filtered;
}
hash = {a: 1, b: 2, c: 3};
console.log((hash_filter(hash, function(item){return item > 1;})));
// Object {b=2, c=3}
TL;DR:Object.keys()很棒!
我有一个名为allFilterValues的对象,包含以下内容:
{"originDivision":"GFC","originSubdivision":"","destinationDivision":"","destinationSubdivision":""}
这很难看,但您要求使用基于下划线的方法来过滤对象。这就是我只返回具有非虚假值的过滤器元素的方式;您可以将筛选器的返回语句切换到您需要的任何内容:
var nonEmptyFilters = _.pick.apply({}, [allFilterValues].concat(_.filter(_.keys(allFilterValues), function(key) {
return allFilterValues[key];
})));
输出(JSON/字符串化):
{"originDivision":"GFC"}
@Dexygen使用_.pick是正确的,但更干净的解决方案是可能的,因为该函数也接受谓词
返回对象的副本,该副本已筛选为仅具有允许的键(或有效键数组)的值或者接受一个谓词,该谓词指示要选择哪些键。
(亮点是我的)
这是我在项目中使用的一个真实的例子
_.pick({red: false, yellow: true, green: true}, function(value, key, object) {
return value === true;
});
// {yellow: true, green: true}
const obj = {
1 : { active: true },
2 : { active: false },
3 : { active: false },
}
let filtered = Object.entries(obj).reduce((acc, current) => {
const currentEntry = current[1];
const currentKey = current[0];
//here you check condition
if (currentEntry.active) {
return {
...acc,
[currentKey]: currentEntry
}
}
return acc;
}, {})
有一条经验法则,如果你需要在reducer中实现一些非常奇特的外观,它可以解决几乎所有与对象相关的问题,习惯它有点困难,但相信我,彻底阅读文档会有回报的。
也许你想要一种最简单的方法
_.filter(me.collections, { selected: true})
相关文章:
- 如何将Underscore.js过滤器与对象一起使用
- 为什么'这'与函数对象一起使用时会有不同的处理方式
- ASP.NET MVC - 将 PartView 与另一个对象一起返回给 Ajax
- 将jQuery与我自己的文档对象一起使用
- IndexOf 不能与包含数组的对象一起正常工作
- 将引导工具提示与 SVG 对象一起使用 - 尽管指定了容器,但不显示
- 将jQuery砖石与绝对定位的父对象一起使用
- 如何使与jquery延迟对象一起工作的函数表现得像同步函数
- Array.prototype.map.bind与对象一起使用是否可靠
- Backbone将Undercore模板与辅助对象一起使用
- Expressjs-有没有一种方法可以让helper函数与req,res对象一起使用
- 是将数据作为属性附加到延迟对象,还是将数据与延迟对象一起发送到执行解析的函数
- ChartJs不能与这个JSON对象一起工作
- 与对象一起继承子对象
- 美元.扩展不能与数组和in对象一起工作
- 无法将attr与D3 v4中的对象一起使用
- 如何将两个jquery对象一起设置动画
- React:您可以将setState与现有的状态对象一起使用吗
- Pixi.js你如何将moveTo与OOP对象一起使用
- 为什么我的代码不能与播放器对象一起工作