英俊的刺猬 · 转化为unsigned ...· 1 年前 · |
爱看球的牙膏 · java put ...· 1 年前 · |
火爆的乒乓球 · 在Arduino ...· 1 年前 · |
成熟的红薯 · 大数据基础(一)openmpi,mpich, ...· 1 年前 · |
阳刚的烤地瓜 · 将服务器文件夹映射盘符改成本地盘符 - 抖音· 1 年前 · |
我正在寻找一个好的算法来获得一个数组中的所有元素,而不是另一个数组中的元素。因此,给定这些数组:
var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];
我想用这个数组来结束:
var z = ["d","e","g"];
我使用的是jquery,所以我可以利用
$.each()
和
$.inArray()
。这是我提出的解决方案,但似乎应该有更好的方法。
// goal is to get rid of values in y if they exist in x
var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];
var z = [];
$.each(y, function(idx, value){
if ($.inArray(value,x) == -1) {
z.push(value);
alert(z); // should be ["d","e","g"]
这是 code in action 。有什么想法吗?
var z = $.grep(y, function(el){return $.inArray(el, x) == -1});
此外,该方法的名称太短,不利于其自身的好处。我希望它指的是isElementInArray,而不是indexOf。
有关对象的演示,请参阅 http://jsfiddle.net/xBDz3/6/
首先制作数组的排序副本。如果顶部元素相等,则将它们都删除。否则,删除较少的元素并将其添加到结果数组中。如果一个数组为空,则将其他数组的其余部分添加到结果中并完成。您可以遍历已排序的数组,而不是移除元素。
// assume x and y are sorted
xi = 0; yi = 0; xc = x.length; yc = y.length;
while ( xi < xc && yi < yc ) {
if ( x[xi] == y[yi] ) {
xi += 1;
yi += 1;
} else if ( x[xi] < y[yi] ) {
z.push( x[xi] );
xi += 1;
} else {
z.push( y[yi] );
yi += 1;
// add remainder of x and y to z. one or both will be empty.
它可以让你对javascript对象运行这样的查询。
例如:
var users = [ { name: "jacob", age: 25 }, { name: "bob" , age: 30 }]
var additionalusers = [ { name: "jacob", age: 25 }, { name: "bill" , age: 25 }]
var newusers = jLinq.from(users).except(additionalusers).select();
>>> newusers = [ { name: "bob" , age: 30 } ]
目前它对您来说有点过头了,但这是一个健壮的解决方案,我很高兴了解到这一点。
它可以做交集,并集,处理布尔逻辑和各种linq风格的好东西。
这里有一个使用 underscore.js 的替代方案
function inAButNotInB(A, B) {
return _.filter(A, function (a) {
return !_.contains(B, a);
}
这是一个迟来的答案,但它没有使用任何库,因此一些人可能会发现它很有帮助。
/**
* Returns a non-destructive Array of elements that are not found in
* any of the parameter arrays.
* @param {...Array} var_args Arrays to compare.
Array.prototype.uniqueFrom = function() {
if (!arguments.length)
return [];
var a1 = this.slice(0); // Start with a copy
for (var n=0; n < arguments.length; n++) {
var a2 = arguments[n];
if (!(a2 instanceof Array))
throw new TypeError( 'argument ['+n+'] must be Array' );
for(var i=0; i<a2.length; i++) {
var index = a1.indexOf(a2[i]);
if (index > -1) {
a1.splice(index, 1);
return a1;
}
示例:
var sheetUsers = ['joe@example.com','fred@example.com','sam@example.com'];
var siteViewers = ['joe@example.com','fred@example.com','lucy@example.com'];
var viewersToAdd = sheetUsers.uniqueFrom(siteViewers); // [sam@example.com]
var viewersToRemove = siteViewers.uniqueFrom(sheetUsers); // [lucy@example.com]
新的ECMA5 javascript的最新答案:
var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];
myArray = y.filter( function( el ) {
return x.indexOf( el ) < 0;
});
在ES6中,只需
const a1 = ["a", "b", "c", "t"];
const a2 = ["d", "a", "t", "e", "g"];
console.log( a2.filter(x => !a1.includes(x)) );
(另一个选项是
a2.filter(x => a1.indexOf(x)===-1)
)
findDiff = (A, B) => {
return A.filter(function (a) {
return !B.includes(a);
}
阳刚的烤地瓜 · 将服务器文件夹映射盘符改成本地盘符 - 抖音 1 年前 |