基于“包含”的数组分区

时间:2018-07-18 02:08:27

标签: javascript underscore.js partition

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一起使用,但想知道为什么不包含吗?

2 个答案:

答案 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>