簡體   English   中英

從數組中刪除匹配特定字符串的所有元素

[英]Remove all elements from array that match specific string

從匹配特定字符串的數組中刪除所有元素的最簡單方法是什么? 例如:

array = [1,2,'deleted',4,5,'deleted',6,7];

我想從數組中刪除所有'deleted'

只需使用Array.prototype.filter()函數來獲取條件的元素

var array = [1,2,'deleted',4,5,'deleted',6,7];
var newarr = array.filter(function(a){return a !== 'deleted'})

更新:ES6 語法

let array = [1,2,'deleted',4,5,'deleted',6,7]
let newarr = array.filter(a => a !== 'deleted')

如果你有多個字符串要從主數組中刪除,你可以試試這個

// Your main array 
var arr = [ '8','abc','b','c'];

// This array contains strings that needs to be removed from main array
var removeStr = [ 'abc' , '8'];

arr = arr.filter(function(val){
  return (removeStr.indexOf(val) == -1 ? true : false)
})

console.log(arr);

// 'arr' Outputs to :
[ 'b', 'c' ]

或者

更好的性能(使用哈希) ,如果不需要嚴格的類型相等

// Your main array 
var arr = [ '8','deleted','b','c'];

// This array contains strings that needs to be removed from main array
var removeStr = [ 'deleted' , '8'];
var removeObj = {};  // Use of hash will boost performance for larger arrays
removeStr.forEach( e => removeObj[e] = true);

var res = arr.filter(function(val){
  return !removeObj[val]
})

console.log(res);

// 'arr' Outputs to :
[ 'b', 'c' ]
array = array.filter(function(s) {
    return s !== 'deleted';
});

如果你想要相同的數組,那么你可以使用

var array = [1,2,'deleted',4,5,'deleted',6,7];
var index = "deleted";
for(var i = array.length - 1; i >= 0; i--) {
    if(array[i] === index) {
       array.splice(i, 1);
    }
}

例 1

否則,您可以使用Array.prototype.filter創建一個新數組,其中包含通過提供的函數實現的測試的所有元素。

 var arrayVal = [1,2,'deleted',4,5,'deleted',6,7];
function filterVal(value) {
  return value !== 'deleted';
}
var filtered = arrayVal.filter(filterVal);

例2

規范的答案可能如下所示:

[10, 'deleted', 20, 'deleted'].filter(x => x !== 'deleted');
//=> [10, 20]

這里沒有什么出乎意料的; 任何開發人員都可以閱讀、理解和維護此代碼。 從這個角度來看,這個解決方案很棒。 我只是想提供一些不同的觀點。

首先,當條件“反轉”時,我有時會與過濾器的語義作斗爭:

[2, 3, 2, 3].filter(x => x === 2);
[2, 3, 2, 3].filter(x => x !== 2);

這是一個人為的例子,但我敢打賭,一些讀者確實停頓了一納秒。 從長遠來看,這些小的認知障礙可能會讓人筋疲力盡。

我個人希望有一個拒絕方法:

[2, 3, 2, 3].filter(x => x === 2);
[2, 3, 2, 3].reject(x => x === 2);

其次,在這個表達式x => x === 2有很多“機器”:一個函數表達式、一個參數和一個相等性檢查。

這可以通過使用柯里化函數來抽象出來:

const eq =
  x => y =>
    x === y;

[2, 3, 2, 3].filter(eq(2));
//=> [2, 2]

我們可以看到eq(2)x => x === 2相同,只是更短並增加了語義。

現在讓我們構建一個reject函數並使用eq

const reject =
  (pred, xs) =>
    xs.filter(x =>
      pred(x) === false);

reject(eq(2), [2, 3, 2, 3]);
//=> [3, 3]

但是如果我們需要拒絕其他的東西呢? 嗯,我們可以建立一個either功能,使用eq

const either =
  (...xs) => y =>
    xs.some(eq(y));

reject(either(1, 2), [1, 3, 2, 3]);
//=> [3, 3]

最后回答你的問題:

reject(eq('deleted'), [1, 'deleted', 3]);
//=> [1, 3]

reject(either('deleted', 'removed'), [1, 'deleted', 3, 'removed', 5]);
//=> [1, 3, 5]

我們可以更進一步並根據不同的謂詞進行刪除,例如 remove if 匹配字符串 "delete" 或 is 0

讓我們構建一個采用謂詞列表的eitherfn函數:

const eitherfn =
  (...fn) => y =>
    fn.some(f =>
      f(y));

現在讓我們構建一個match函數:

const match =
  x => y =>
    typeof y === 'string'
      ? y.includes(x)
      : false;

然后:

reject(eitherfn(match('delete'), eq(0)), [0, 1, 'deleted', 3, 'will delete', 5])
// [1, 3, 5]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM