Javascript 整数数组比较
我有一个关于JS数组的问题 例如:Javascript 整数数组比较,javascript,arrays,Javascript,Arrays,我有一个关于JS数组的问题 例如: var fullArr = [1,2,3,4]; var partArr = [2,3]; var newArr = []; 我们有一个主数组fullArr和一个部分数组partarr。我想创建一个函数/过滤器,它在fullArr中查找现有项,而不是在partArr中查找现有项。 在上述示例中,newArr必须等于[1,4] 我试过做类似的事情,但效果不太好 for (var k in fullArray) { // [1,2,3,4] for (v
var fullArr = [1,2,3,4];
var partArr = [2,3];
var newArr = [];
我们有一个主数组fullArr
和一个部分数组partarr
。我想创建一个函数/过滤器,它在fullArr
中查找现有项,而不是在partArr
中查找现有项。
在上述示例中,newArr
必须等于[1,4]
我试过做类似的事情,但效果不太好
for (var k in fullArray) { // [1,2,3,4]
for (var j in selectedArray) { // [1,4]
if (fullArray[k] == selectedArray[j]) {
newArray.splice(selectedArray[j] - 1, 1); // must be [2,3]
break;
}
}
}
做这个的好方法是什么?谢谢。这里有一个
var newArr = fullArr.filter(function(f) { // The filter() method creates a new array with all elements that pass the test implemented by the provided function.
return partArr.indexOf(f) == -1; // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.
})
为了给女孩留下深刻印象,你也可以
var newArr = fullArr.filter(function(f) {
return !~partArr.indexOf(f);
})
这是您的需求代码
var fullArr = [1,2,3,4];
var partArr = [2,3];
var newArr = [];
for(var i=0;i<fullArr.length;i++){
if(partArr.indexOf(fullArr[i]) == -1)
newArr.push(fullArr[i]);
};
var fullArr=[1,2,3,4];
var partArr=[2,3];
var newArr=[];
对于(var i=0;i,可以使用在数组上工作的filter()
函数:
var newArr = fullArr.filter(function(val, i, arr) {
return partArr.indexOf(val) === -1;
});
这将返回一个新数组,其中包含返回true
的每个迭代的值
如果将来需要在对象上执行此操作,最好的方法是首先将对象键转换为数组,然后运行过滤器:
Object.keys(myObj).function(val, i, arr) {
return partArr.indexOf(val) === -1;
});
以下是其他几种方法:
var fullArr = [1,2,3,4];
var partArr = [2,3];
var newArr = [];
1.
fullArr.map(function(element){
if(partArr.indexOf(element) === -1) newArr.push(element);
})
console.log(newArr);
2.
for(i in fullArr){
if(partArr.indexOf(fullArr[i]) === -1) newArr.push(fullArr[i]);
}
console.log(newArr);
3.
fullArr.forEach(function(element){
if(partArr.indexOf(element) === -1) newArr.push(element);
})
console.log(newArr);
事实上,您希望阵列之间有一个公共部分。显然,您可以选择splice
或indexOf
来获得O(n*m)
甚至O(m*n^2)
性能。对于任何大于几个元素的阵列来说,这显然是次优的
或者您可以使用对象作为散列映射来查找(在最坏的情况下)O(n+m log m)
:
在本例中,我使用了名为“”的ES6功能。它转换为以下ES5代码:
var partArr = [2, 3];
var temporaryObject = Object.create(null);
partArr.forEach(function (el) {
temporaryObject[el] = true;
}); // temporaryObject after this operation is {"2": true, "3": true}
var newArr = fullArr.filter(function (el) {
return temporaryObject[el];
});
但是它没有正常工作
它是如何工作的?它会给你带来什么结果?附带说明,这可能与你的代码无关,但一般来说,在数组中使用for…是个坏主意,因为顺序不能保证。使用常规的for
循环。使用数组。过滤器是更简单的解决方案,但您可能还需要查看文档,因为您没有正确地使用它尝试向newArr
添加一个项目时,使用push
会更容易。一点解释可能会改善您的回答真的?Array.filter和Array.indexOf应该是新手javascript编程人员的面包和黄油。很明显,他们不在OP中。因此,也许您可以帮他们一点忙?或者,为什么费心回答吗?@MattBurland你知道,我已经回答了很多问题,OP回答说“哦,当然,我应该看到”…不能赢:p-添加了解释,完全抄袭了mdn:pThanks的解释!
var partArr = [2, 3];
var temporaryObject = Object.create(null);
partArr.forEach(function (el) {
temporaryObject[el] = true;
}); // temporaryObject after this operation is {"2": true, "3": true}
var newArr = fullArr.filter(function (el) {
return temporaryObject[el];
});