跳至內容
Astera Technology

清單篩選再轉格式,原資料可以保留

先篩可見項目,再改顯示格式,核對原資料有沒有被改。

下載完整個案資料及參考答案 ↓

先追這段程式

三列資料是 A、B、C。畫面只要可見列,再把 ID 轉小寫;B 不顯示,但來源仍須保留。

完整原始程式
const source=[{id:'A',visible:true},{id:'B',visible:false},{id:'C',visible:true}];
const display=source.filter(row=>row.visible).map(row=>row.id.toLowerCase());
console.log(JSON.stringify({display,sourceIds:source.map(row=>row.id)}));
確實的 console 輸出
{"display":["a","c"],"sourceIds":["A","B","C"]}
值與執行位置
處理階段ID對來源的影響
來源A, B, Clength: 3
filterA, C只在結果略過 B
mapa, c傳回文字

結果為何如此

filter 建立所選值的新陣列,map 建立回呼結果的新陣列。本例只讀原物件、傳回文字,因此來源不變;若直接保留物件,參照仍共用,回呼也可能自行改它們。

比較另一種寫法

透過篩選結果改物件,原物件也會變。新陣列不等於各列資料都已複製。

另開的有限例子
const source=[{id:'A',visible:true},{id:'B',visible:false}];const filtered=source.filter(row=>row.visible);
filtered[0].id='Changed';
console.log(JSON.stringify({differentArray:filtered!==source,sameRow:filtered[0]===source[0],sourceIds:source.map(row=>row.id)}));
另一寫法的輸出
{"differentArray":true,"sameRow":true,"sourceIds":["Changed","B"]}

試清邊界

所有列都不顯示時,filter 會否把來源清空?

查看參考答案

不會。結果是空陣列,原有列和次序仍保留。

重新建立的邊界例子
const source=[{id:'A',visible:false},{id:'B',visible:false}];const display=source.filter(row=>row.visible).map(row=>row.id.toLowerCase());
console.log(JSON.stringify({display,sourceIds:source.map(row=>row.id),length:source.length}));
邊界例子的輸出
{"display":[],"sourceIds":["A","B"],"length":2}

原始例子檔案