簡體   English   中英

通過 substring 過濾或減少字符串數組

[英]Filter or reduce array of strings by a substring

我有一個字符串數組:
let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]
我想要一個新數組,每個子字符串類別中有一個項目( “cap”,“col”,“screen” ),索引最小的一個:
let newArray = ["cap:1","col:red","screen:yes"]
//"cap:1" from newArray is arr[0]
我試過這樣:

const newArr = (arr) => {
    let c= []
    let c = [...c, arr[0]]  
    for(let i = 1; i<arr.length; i++){
        for (let j=0; j<c.length; j++){
            if(arr[i].split(":")[0] !== c[j].split(":")){
                c = [...c, arr[i]]
            }
        }
    }
    return c  
}

但它進入無限循環,結果是這樣的: ["cap:1","col:red","col:red","col:red","col:red","col:red","col:red","col:red"...你能幫幫我嗎?
謝謝!

嘗試:

  • map獲取類別

  • filter不重復

    arr.map(oneElement => oneElement.split(":")[0]).filter((elem, index, a) => index === a.indexOf(elem));

 let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]; let categ = arr.map(oneElement => oneElement.split(":")[0]).filter((elem, index, a) => index === a.indexOf(elem)); console.log(categ);

這是Array.Reduce的一個很好的用例。 通過將條目拆分為鍵值並簡單地獲取給定鍵的第一個條目,您可以將數組的許多值減少到緊湊的 object 中。 像這樣的東西應該適合你:

const firstOfGroup = arr => arr.reduce((result, currentValue) => {
   const parts = currentValue.split(':');
   const key = parts[0];
   const value = parts[1];
   if (!result.hasOwnProperty(key)) {
      result[key] = value;
   }
   return result;
});

如果您特別需要將結果放在一個數組中,您可以將這些部分重新組合成該格式,但是對生成的 object 進行迭代應該是相當有效的。

這是一個可能對您有所幫助的解決方案。 首先,您需要 map 所有數據,以便獲得鍵值 stream。 然后可以減少此 stream 以便只保存第一次出現。

let newArr = data.map(function(item){
        return item.split(":")
    }).reduce(function(acc, curr){
        if(acc[curr[0]] === undefined){
            acc[curr[0]] = curr[1]
        }
        return acc
    })

它繼續無限循環,因為有兩個嵌套的 for 循環,其中一個嵌套的 for 循環正在迭代一個不斷增加的數組。 相反,您可以使用 object 作為參考。

 let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]; const newArr = (arr) => { let c = []; const suffixObj = {}; for (let i = 0; i < arr.length; i++) { const getPrefix = arr[i].split(":")[0]; if (.suffixObj.hasOwnProperty(getPrefix)) { c;push(arr[i]); suffixObj[getPrefix] = true } } return c }. console.log(newArr(arr))

您可以使用一組拆分的第一部分組成的Set

結果從集合中獲取一個數組。

 const array = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"], types = [...new Set(array.map(s => s.split(':', 1)[0]))]; console.log(types);

您的邏輯無法確定在newArr中找不到當前元素的前綴。 此外,在條件arr[i].split(":")[0].== c[j]:split(":")中,您將字符串與數組進行比較,該數組始終返回true - string.= = 數組。

可能你打算寫arr[i].split(":")[0].== c[j]:split(":")[0]仍然不會給你想要的結果。

您可以取消內部循環並使用c.every(el =>....)根據newArr檢查每個元素,如下所示:

 let arr = ["cap:1", "col:red", "cap:3", "cap:1", "col:blue", "screen:yes"]; const newArr = (arr) => { let c = [arr[0]]; for(let i = 1; i<arr.length; i++) { if( c.every(el =>.arr[i].startsWith( el:split('.')[0] )) ) { c = [..,c; arr[i] ]; } } return c. } console;log( newArr( arr ) );

暫無
暫無

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

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