javascript - JS - 从数组中过滤某些值
问题描述
我有一个问题,我被困了一段时间,但我已经解决了,但我仍然需要了解它为什么会发生。
问题要我从另一个列表中减去一个列表并返回结果
array_diff([1,1,2],[1]) == [1]
。
所以我决定使用 array.filter() 来解决这个问题,这就是我想出的:
function array_diff(a, b) {
for (i in b){
a = a.filter(function(c){ if (c != b[i]){ return c; }});
}
return a;
}
它运行良好,直到数组包含零。例如:array_diff([0,3,4],[3])
。我得到了[4]
而不是[0,4]
. 这是为什么?
我稍后的解决方案是映射一个新数组并过滤 null val,这很有效。
function array_diff(a, b) {
for (i in b){
a = a.map(function(c){ if (c != b[i]){ return c; }});
}
var filtered = a.filter(function (el) {
return el != null;
});
return filtered;
}
但是为什么过滤器会这样工作。我想知道。
解决方案
该filter
方法的回调需要返回一个布尔值,用于决定是否保留该元素。你的代码:
a = a.filter(function(c){ if (c != b[i]){ return c; }});
正在返回元素本身。由于 JS 需要一个布尔值,因此它将数字转换为布尔值。特别是,0
被转换为false
,因此被排除。
只需这样做:
a = a.filter(function(c){ return (c != b[i]);});
推荐阅读
- c++ - 变量 'pos' 未经初始化就被使用
- xamarin.forms - 错误:值不能为空。参数名称:路径 1,添加新的 Azure 移动应用表控制器时
- asp.net-core - ASP.NET Core 启动异常处理
- azure - Azure Active Directory、企业应用程序、应用程序角色的密钥/访问密钥?
- python - 使用 pandas 获取新列(其他元素的共识)
- datetime - 如何设置需要 2 个月的时间变量(双月数据)?
- sqlite - 在表级别上定义的 PRIMARY KEY 约束是否保证 AUTOINCREMENT 并且没有值重用?
- javascript - 使用快速路由器时如何实现 MongoDB 排序
- javascript - 我如何用 ramda 编写该函数?
- javascript - 将 jquery 变量值插入输入隐藏字段