我有一個字串陣列:
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"...
你能幫幫我嗎?
謝謝!
uj5u.com熱心網友回復:
這是Array.Reduce 的一個很好的用例。通過將條目拆分為鍵值并簡單地獲取給定鍵的第一個條目,您可以將陣列的許多值減少到一個緊湊的物件中。像這樣的事情應該適合你:
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;
});
如果您特別需要將結果放置在陣列中,您可以將這些部分重新組合成該格式,但對結果物件的迭代應該相當有效。
uj5u.com熱心網友回復:
這是一個可能對您有幫助的解決方案!首先,您需要映射所有資料,以便獲得鍵值流。然后可以減少此流,以便僅保存第一次出現。
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
})
uj5u.com熱心網友回復:
嘗試:
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);
uj5u.com熱心網友回復:
它繼續無限回圈,因為有兩個嵌套的 for 回圈,其中一個嵌套的 for 回圈正在迭代一個不斷增加的陣列。相反,您可以使用一個物件作為參考。
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))
uj5u.com熱心網友回復:
您可以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);
uj5u.com熱心網友回復:
您的邏輯無法確定當前元素的前綴在newArr. 此外,在arr[i].split(":")[0] !== c[j].split(":")您將字串與陣列進行比較的條件下,陣列始終回傳true- 字串 !== 陣列。
可能您打算撰寫arr[i].split(":")[0] !== c[j].split(":")[0]仍然不會給您想要的結果。
您可以不設內部回圈,并檢查每個元素對newArr使用c.every(el => !...)如下:
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 ) );
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/376761.html
標籤:javascript 数组 细绳 筛选 分裂
