正如 Dogbert 所说filter
并every
完成了这项工作。但是,这是一种非常缓慢的方法。这就是 SQL 查询很有帮助的事情。假设您在 SQL 中有下表:
List
+------+------+
| Mode | Type |
+------+------+
| 1 | foo |
+------+------+
| 2 | foo |
+------+------+
| 3 | foo |
+------+------+
| 1 | bar |
+------+------+
| 2 | bar |
+------+------+
| 3 | bar |
+------+------+
您可以执行以下两个查询之一来获取您想要的数据:
查询 1:建设性(创建一个新表)
SELECT * FROM List WHERE Mode != '3' AND Type != 'foo';
查询 2:破坏性(从表中删除行)
DELETE FROM List WHERE Mode = '3' AND Type = 'foo';
当然,JavaScript 不是 SQL。但是,我们可以使用这两个 SQL 查询作为指导,在 JavaScript 中创建两个生成正确结果的函数。
功能一:建设性
function filter(table, conditions) {
var rows = table.length, length = conditions.length, result = [];
for (var i = 0; i < rows;) {
var row = table[i++];
for (var j = 0; j < length;) {
var condition = conditions[j++];
if (row[condition.propertyName] !== condition.value) {
result.push(row);
break;
}
}
}
return result;
}
功能2:破坏性
function remove(table, conditions) {
var rows = table.length, length = conditions.length, result = [];
loop: for (var i = 0; i < rows;) {
var row = table[i++];
for (var j = 0; j < length;) {
var condition = conditions[j++];
if (row[condition.propertyName] !== condition.value)
continue loop;
}
table.splice(--i, 1);
rows--;
}
}
现在给定一个表格和一个条件列表,您可以选择其中一个filter
或remove
不想要的行。
考虑您有下表:
var table = [
{ mode: 1, type: 'foo' },
{ mode: 2, type: 'foo' },
{ mode: 3, type: 'foo' }, // remove this item
{ mode: 1, type: 'bar' },
{ mode: 2, type: 'bar' },
{ mode: 3, type: 'bar' }
];
鉴于以下条件:
var conditions = [
{ propertyName: 'mode', value: 3 },
{ propertyName: 'type', value: 'foo' }
];
你可以这样做:
var result = filter(table, conditions);
或者你可以这样做:
remove(table, conditions);
就我个人而言,我更喜欢filter
(remove
以防万一您需要原始表格)。
好的,那么这些方法比 Dogbert 的解决方案更好吗?答案是因为它们要快得多。他们这么快的原因是:
- 您不使用
[].filter
which is slow 因为您为表中的每一行执行回调。
- 您不使用
[].every
which 也很慢,因为您为每个条件执行回调。
本质上两者filter
和remove
都是相同的 Dogbert 解决方案。但是,由于它们是手工制作的并且不使用回调,因此执行速度要快得多。亲自查看结果:
http://jsperf.com/filter-and-every-vs-filter-vs-remove