[英]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.