var array = [ "123-foo", "456-bar", "789-baz" ];
var selected = [ "123", "789" ];
var partition_contains = _.partition(array, function(value){
return _.contains(selected, value);
});
console.log(partition_contains);
var partition_filter = _.partition(array, function(value){
return !!_.filter(selected, function(s){ return value.indexOf(s) !== -1; }).length;
});
console.log(partition_filter);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
输出为:
[
[],
[
"123-foo",
"456-bar",
"789-baz"
]
]
预期输出:
[
[
"123-foo",
"789-baz"
],
[
"456-bar"
]
]
为什么在内部使用indexOf
却不包含预期的工作?
编辑:可以与filter
一起使用,但想知道为什么不包含吗?
答案 0 :(得分:1)
从第一种方法来看,我认为这是因为_.contains
将数组和目标值之间的精确值匹配。
console.log(_.contains(selected, "123-foo")); // false
我的解决方案将使用Array中的some
方法。
var partitioned = _.partition(array, value => selected.some(select => value.indexOf(select) > -1));
console.log(partitioned);
我看到underscore.js也有_.some
方法。
答案 1 :(得分:1)
下划线的.contains
:
https://underscorejs.org/#contains
_.contains(list, value, [fromIndex])
别名:包含,包含如果该值存在于列表中,则返回true。如果list是Array,则在内部使用indexOf。使用fromIndex可以从给定的索引开始搜索。
array
中没有任何项目位于selected
中,因此测试始终会失败。 indexOf
仅返回数组项目完全匹配的0
+。
请尝试执行此操作,检查some
中是否包含selected
个项目中的value
:
var array = [ "123-foo", "456-bar", "789-baz" ];
var selected = [ "123", "789" ];
var partition_filter = _.partition(array, value => (
selected.some(sel => value.includes(sel))
));
console.log(partition_filter);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>