【发布时间】:2011-10-06 01:39:42
【问题描述】:
假设我们有以下数组:
a = [1, 2, 3, 4, 5]
和
b = [2, 3]
如何从 a 中减去 b?这样我们就有了c = a - b,它应该等于[1, 4, 5]。 jQuery 解决方案也可以。
【问题讨论】:
标签: javascript jquery arrays
假设我们有以下数组:
a = [1, 2, 3, 4, 5]
和
b = [2, 3]
如何从 a 中减去 b?这样我们就有了c = a - b,它应该等于[1, 4, 5]。 jQuery 解决方案也可以。
【问题讨论】:
标签: javascript jquery arrays
假设您使用的是具有 Array.prototype.filter 和 Array.prototype.indexOf 的浏览器,您可以使用这个:
var c = a.filter(function(item) {
return b.indexOf(item) === -1;
});
如果有问题的浏览器没有这些方法,您可以填充它们。
【讨论】:
这是@icktoofay 发布的答案的修改版本。
在 ES6 中我们可以使用:
这会将我们的代码简化为:
var c = a.filter(x => !b.includes(x));
演示:
var a = [1, 2, 3, 4, 5];
var b = [2, 3];
var c = a.filter(x => !b.includes(x));
console.log(c);
【讨论】:
对于适用于所有浏览器的代码,您必须手动从 a 中的 b 中查找每个元素并将其删除。
var a = [1, 2, 3, 4, 5];
var b = [2, 3];
var result = [], found;
for (var i = 0; i < a.length; i++) {
found = false;
// find a[i] in b
for (var j = 0; j < b.length; j++) {
if (a[i] == b[j]) {
found = true;
break;
}
}
if (!found) {
result.push(a[i]);
}
}
// The array result now contains just the items from a that are not in b
这里的工作示例:http://jsfiddle.net/jfriend00/xkBzR/
而且,这里有一个版本对于大型数组可能更快,因为它将所有内容都放入一个对象中以进行散列查找而不是暴力数组搜索:
var a = [1, 2, 3, 4, 5];
var b = [2, 3];
function filterArray(src, filt) {
var temp = {}, i, result = [];
// load contents of filt into object keys for faster lookup
for (i = 0; i < filt.length; i++) {
temp[filt[i]] = true;
}
// go through src
for (i = 0; i < src.length; i++) {
if (!(src[i] in temp)) {
result.push(src[i]);
}
}
return(result);
}
var filtered = filterArray(a, b);
【讨论】:
Array.filter方法?在其他情况下也可能有用。
Array.filter() 很有用——我只是提供一个替代方案。有些人不想向现有核心对象添加方法,或者如果这样做,他们的代码可能会中断。
对于那些在对象上苦苦挣扎的人,比如 Date,你会发现两个不同的对象永远不会彼此相等,即使它们具有相同的值,所以上面的答案是行不通的。 这是 ES6 中这个问题的答案。
const c = a.filter(aObject => b.findIndex(bObject => aObject.valueOf() === bObject.valueOf()) === -1)
【讨论】:
这里的 try 实现适用于所有浏览器:
if('filter' in Array == false) {
Array.prototype.filter =
function(callback) {
if(null == this || void 0 == this) {
return;
}
var filtered = [];
for(i = 0, len = this.length; i < len; i++) {
var tmp = this[i];
if(callback(tmp)) {
filtered.push(tmp);
}
}
return filtered;
}
}
a = [1, 2, 3, 4, 5];
b = [2, 3];
var c = a.filter(function(item) { /*implementation of icktoofay */
return b.indexOf(item) === -1;
});
【讨论】:
可能是一个过时的查询,但我认为这可能对某人有用。
let first = [1,2,3,4,5,6,7,9];
let second = [2,4,6,8];
const difference = first.filter(item=>!second.includes(item));
console.log(difference);//[ 1, 3, 6,7]
/*
the above will not work for objects with properties
This might do the trick
*/
const firstObj = [{a:1,b:2},{a:3,b:4},{a:5,b:6},{a:7,b:8}]//not ideal. I know
const secondObj = [{a:3,b:4},{a:7,b:8}]
const objDiff = firstObj.filter(obj=>
!secondObj.find(sec=>//take note of the "!"
sec.a===obj.a
&&//or use || if you want to check for either or
sec.b===obj.b
)//this is formatted so that it is easily readable
);
console.log(objDiff)/*
[
{
"a": 1,
"b": 2
},
{
"a": 5,
"b": 6
}
]
*/
【讨论】: