![](/img/trans.png)
[英]Compare(filter) multiple array values from a dynamic array using Javascript
[英]JavaScript Remove Multiple Values from Array Using Filter and Loop
我是新來的,需要一些幫助來編寫函數destroyer()
以從數組中刪除多個值。
destroyer()函數傳入一個數組和其他數字作為參數。 我們的想法是從數組中刪除數字。
例如
destroyer([1, 2, 3, 1, 2, 3], 2, 3)
輸出: [1, 1]
destroyer(["tree", "hamburger", 53], "tree", 53)
輸出: ["hamburger"]
destroyer([2, 3, 2, 3], 2, 3)
輸出: []
注意:示例僅顯示要刪除的2個附加數字。 但是函數destroyer()應該能夠刪除任意數量的值(即4個,5個或6個參數)。
但是,我的代碼不會產生相同的結果。 具體來說,使用console.log,我發現我的過濾器功能沒有正確循環。
1)任何人都可以幫我調試嗎?
2)有沒有更好的方法來編寫這個函數?
非常感謝你!!!
function destroyer() {
var args = Array.prototype.slice.call(arguments);
var itemToRemove = args.slice(1);
console.log(itemToRemove);
var newArr = args[0];
console.log(newArr);
function filterer(value) {
for (var i = 0; i < itemToRemove.length; i++) {
console.log(i);
console.log(itemToRemove[i]);
if (value != itemToRemove[i]) {
return value;
}
}
}
return newArr.filter(filterer);
}
您的filterer
功能可以更簡單:
function filterer (value) {
return itemToRemove.indexOf(value) === -1;
}
與時間復雜度方面的對象屬性查找相比,使用Array.prototype.indexOf()
可能效率低下。 我建議一次循環其他參數並構造一個目標元素作為鍵被銷毀的對象。 然后,您可以在傳遞給Array.prototype.filter()
的過濾回調中檢查給定值是否為目標。
function destroyer() {
var arr = arguments.length && arguments[0] || [];
var targets = {};
for (var i = 1; i < arguments.length; i++) {
targets[arguments[i]] = true;
}
return arr.filter(function (x) {
return targets[x] === undefined;
});
}
這種方法的一個缺點是,並非JS中的所有值都可以是對象的有效屬性,因為屬性必須是字符串。 在這種情況下,您只是使用數字作為鍵,這些數字被隱式轉換為字符串。
我們可以在filter()方法中將參數傳遞給我們的回調函數。
function destroyer(arr) {
return arr.filter(filterer(arguments)); // Pass arguments
}
function filterer(args) {
return function(value) { // Actual filter function
for (var i = 1; i < args.length; i++) {
if (value === args[i]) // Seek
return false; // Destroy
}
return true; // Otherwise keep
};
}
這傳遞了freeCodeCamp的所有5個測試用例 基本算法腳本| 尋求和毀滅 。
以下代碼將從數組中刪除元素。 它刪除的元素由任何額外參數定義。 ...remove
是一項ES6功能,可將額外參數聚合到一個數組中。
我將迭代...remove
數組並從我們正在處理的主數組中刪除該元素。
這是一個JSFiddle: https ://jsfiddle.net/zzyopnnp/
...extra_parameters
在大多數瀏覽器中不支持...extra_parameters
,您可能希望使用arguments
對象。
function removeIndex(array, index) {if(index>-1){array.splice(index, 1);}}
function destroyer(array, ...remove) {
remove.forEach(function(elem, index) {
removeIndex(array, index);
});
};
var arr = ["tree", "hamburger", 53];
destroyer(arr, "tree", 53);
console.log(arr);
一個簡單的功能
function filter(arr, arg1, arg2){
var j = arr.length;
while(j){
if (arr.indexOf(arg1) > -1 || arr.indexOf(arg2) > -1){
arr.splice(j - 1, 1);
}
j--
}
}
對於多個參數
一個簡單的功能
function filter(){
var j = -1;
for(var i = 1; i < arguments.length; i++){
j = arguments[0].indexOf(arguments[i]);
if(j > -1){
arguments[0].splice(j, 1);
}
}
return arguments[0];
}
你可以調用這個沒有args的函數,例如:
filter([1,2,3,4,5,6,7,8,9], 1, 3, 5); //return [2,4,6,7,8,9]
filter([1,2,3,4,5,6,7,8,9], 1); //return [2,3,4,5,6,7,8,9]
這里有很好的答案,但你可以用這種方式做得非常干凈,記住你在filter方法中有一個對象選項,你可以在回調函數中使用,在這種情況下我使用它就像: arguments [i]所以我可以檢查arguments數組中的每個值
function destroyer(arr) {
for(var i = 1; i < arguments.length; i++){
arr = arr.filter(isIn, arguments[i]);
}
function isIn(element,index, array){
if (element != this){
return element;
}
}
return arr;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.