您好,感謝您的寶貴時間!
我有物件陣列:
[
{ word: 'T', start: 8.87085, end: 8.88011 },
{ word: 'A', start: 8.59176, end: 8.87085 },
{ word: 'C', start: 8.39242, end: 8.59176 },
{ word: 'A', start: 8.07347, end: 8.39242 },
{ word: 'A', start: 7.87412, end: 8.07347 },
{ word: 'T', start: 7.71465, end: 7.87412 },
{ word: 'A', start: 7.51531, end: 7.71465 },
{ word: 'T', start: 7.23622, end: 7.5153 },
{ word: 'A', start: 7.11661, end: 7.23622 },
{ word: 'C', start: 6.91727, end: 7.11661 },
{ word: 'C', start: 6.63818, end: 6.91727 },
{ word: 'A', start: 6.47871, end: 6.63818 },
{ word: 'C', start: 6.39897, end: 6.47871 },
{ word: 'T', start: 5.52185, end: 6.02185 },
{ word: 'T', start: 3.76762, end: 4.26762 },
{ word: 'A', start: 3.36893, end: 3.76762 },
{ word: 'A', start: 3.04997, end: 3.36893 },
{ word: 'C', start: 2.69115, end: 3.04997 },
{ word: 'A', start: 2.57155, end: 2.69115 },
{ word: 'T', start: 2.41207, end: 2.57155 },
{ word: 'A', start: 2.21272, end: 2.29246 },
{ word: 'A', start: 1.65456, end: 2.15456 },
{ word: 'A', start: 1.45521, end: 1.65456 },
{ word: 'T', start: 1.25587, end: 1.45521 },
{ word: 'A', start: 1.01665, end: 1.25587 },
{ word: 'A', start: 0.85718, end: 1.01665 },
{ word: 'A', start: 0.61796, end: 0.85718 }
]
我需要從單詞 == 'C' 到單詞 == 'T' 的周期中切割物件。
輸出應該是這樣的:
[
{ word: 'T', start: 8.87085, end: 8.88011 },
{ word: 'A', start: 8.59176, end: 8.87085 },
{ word: 'A', start: 7.51531, end: 7.71465 },
{ word: 'T', start: 7.23622, end: 7.5153 },
{ word: 'A', start: 7.11661, end: 7.23622 },
{ word: 'T', start: 3.76762, end: 4.26762 },
{ word: 'A', start: 3.36893, end: 3.76762 },
{ word: 'A', start: 3.04997, end: 3.36893 },
{ word: 'A', start: 2.21272, end: 2.29246 },
{ word: 'A', start: 1.65456, end: 2.15456 },
{ word: 'A', start: 1.45521, end: 1.65456 },
{ word: 'T', start: 1.25587, end: 1.45521 },
{ word: 'A', start: 1.01665, end: 1.25587 },
{ word: 'A', start: 0.85718, end: 1.01665 },
{ word: 'A', start: 0.61796, end: 0.85718 }
]
我的想法是找到物件'C'和'T'的索引并減少這段時間。但我對實作有疑問(見代碼中的注釋)
function glue(data, t, c) {
let dataReverse = data.reverse();
for (let i = 0; i < dataReverse.length; i ) {
let indexT = dataReverse.map(e => e.word).indexOf(c)
let indexC = dataReverse.map(e => e.word).indexOf(t)
if (indexT < indexC) { // Here the condition does not came true , but indexT = 0 and indexC = 2
dataReverse = dataReverse.splice(indexT,1) // what method better to delete the period?
} else {
dataReverse = dataReverse.splice(indexC,indexC-indexT)
}
}
感謝您的想法和實作
uj5u.com熱心網友回復:
您可以使用Array.reduce()和保存切割狀態的標志(isCutting在本例中):
const data = [
{ word: 'T', start: 8.87085, end: 8.88011 },
{ word: 'A', start: 8.59176, end: 8.87085 },
{ word: 'C', start: 8.39242, end: 8.59176 },
{ word: 'A', start: 8.07347, end: 8.39242 },
{ word: 'A', start: 7.87412, end: 8.07347 },
{ word: 'T', start: 7.71465, end: 7.87412 },
{ word: 'A', start: 7.51531, end: 7.71465 },
{ word: 'T', start: 7.23622, end: 7.5153 },
{ word: 'A', start: 7.11661, end: 7.23622 },
{ word: 'C', start: 6.91727, end: 7.11661 },
{ word: 'C', start: 6.63818, end: 6.91727 },
{ word: 'A', start: 6.47871, end: 6.63818 },
{ word: 'C', start: 6.39897, end: 6.47871 },
{ word: 'T', start: 5.52185, end: 6.02185 },
{ word: 'T', start: 3.76762, end: 4.26762 },
{ word: 'A', start: 3.36893, end: 3.76762 },
{ word: 'A', start: 3.04997, end: 3.36893 },
{ word: 'C', start: 2.69115, end: 3.04997 },
{ word: 'A', start: 2.57155, end: 2.69115 },
{ word: 'T', start: 2.41207, end: 2.57155 },
{ word: 'A', start: 2.21272, end: 2.29246 },
{ word: 'A', start: 1.65456, end: 2.15456 },
{ word: 'A', start: 1.45521, end: 1.65456 },
{ word: 'T', start: 1.25587, end: 1.45521 },
{ word: 'A', start: 1.01665, end: 1.25587 },
{ word: 'A', start: 0.85718, end: 1.01665 },
{ word: 'A', start: 0.61796, end: 0.85718 }
]
let isCutting = false
const res = data.reduce((a,b) => {
if (isCutting) {
if (b.word == 'T') { isCutting = false }
} else {
if (b.word == 'C') { isCutting = true }
else { a.push(b) }
}
return a
}, [])
console.log(res)
uj5u.com熱心網友回復:
創建一個索引字串word-index, word-index etc,操作該字串并從剩余索引中生成結果:
result = data
.map((o, i) => o.word i).join('')
.replace(/C. ?T\d /g, '')
.match(/\d /g)
.map(n => data[n])
uj5u.com熱心網友回復:
偽代碼:
Transform the data to remove everything between words 'C' and 'T'.
'retrieval' is a mode that pulls items into a new array.
'retrieve' is the action of pulling an item into a new array.
Initialise `retrieval` to be turned on;
Walk the array pulling item `curr` into a new array `result`;
If the current word is 'C', do not retrieve `curr`, turn off `retrieval`, and continue walking;
If current word is 'T' and retrieval is turned off, do not retrieve, but turn on retrieval;
If retrieval is turned off, continue walking;
Push `curr` into `result`;
end walk
return `result`
const data = [ { word: 'T', start: 8.87085, end: 8.88011 },{ word: 'A', start: 8.59176, end: 8.87085 },{ word: 'C', start: 8.39242, end: 8.59176 },{ word: 'A', start: 8.07347, end: 8.39242 },{ word: 'A', start: 7.87412, end: 8.07347 },{ word: 'T', start: 7.71465, end: 7.87412 },{ word: 'A', start: 7.51531, end: 7.71465 },{ word: 'T', start: 7.23622, end: 7.5153 },{ word: 'A', start: 7.11661, end: 7.23622 },{ word: 'C', start: 6.91727, end: 7.11661 },{ word: 'C', start: 6.63818, end: 6.91727 },{ word: 'A', start: 6.47871, end: 6.63818 },{ word: 'C', start: 6.39897, end: 6.47871 },{ word: 'T', start: 5.52185, end: 6.02185 },{ word: 'T', start: 3.76762, end: 4.26762 },{ word: 'A', start: 3.36893, end: 3.76762 },{ word: 'A', start: 3.04997, end: 3.36893 },{ word: 'C', start: 2.69115, end: 3.04997 },{ word: 'A', start: 2.57155, end: 2.69115 },{ word: 'T', start: 2.41207, end: 2.57155 },{ word: 'A', start: 2.21272, end: 2.29246 },{ word: 'A', start: 1.65456, end: 2.15456 },{ word: 'A', start: 1.45521, end: 1.65456 },{ word: 'T', start: 1.25587, end: 1.45521 },{ word: 'A', start: 1.01665, end: 1.25587 },{ word: 'A', start: 0.85718, end: 1.01665 },{ word: 'A', start: 0.61796, end: 0.85718 } ]
const transform = (data) => {
let retrieval = true, result = []
for(const curr of data) {
if(curr.word === 'C') {
retrieval = false
continue
}
if(!retrieval && curr.word === 'T') {
retrieval = true
continue
}
if(!retrieval) {
continue
}
result.push(curr)
}
return result
}
console.log(transform(data))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/532087.html
