iT邦幫忙

0

陣列分組後,在有 null 與非 null 的項目之中去除 null 值

  • 分享至 

  • xImage

JavaScript 有以下陣列:

let foo = [
    { bar: '1', baz: 'a' },
    { bar: '2', baz: 'a' },
    { bar: '2', baz: 'a' },
    { bar: '3', baz: 'a' },
    { bar: '3', baz: 'b' },
    { bar: '4', baz: 'a' },
    { bar: '4', baz: null },
    { bar: '5', baz: 'a' },
    { bar: '5', baz: 'b' },
    { bar: '5', baz: null },
    { bar: '6', baz: null },
    { bar: '7', baz: null },
    { bar: '7', baz: null },
]

請問如何在 bar 值相同而且 baz 含有 null 與非 null 的項目之中,去除 baznull 的項目?最後應得到以下陣列:

[
    { bar: '1', baz: 'a' },
    { bar: '2', baz: 'a' },
    { bar: '2', baz: 'a' },
    { bar: '3', baz: 'a' },
    { bar: '3', baz: 'b' },
    { bar: '4', baz: 'a' },
    { bar: '5', baz: 'a' },
    { bar: '5', baz: 'b' },
    { bar: '6', baz: null },
    { bar: '7', baz: null },
    { bar: '7', baz: null },
]
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

7
Zero皇
iT邦研究生 3 級 ‧ 2023-09-06 16:16:54
最佳解答

你可以使用js陣列的filter()去過濾,條件是遇到null的話,再用some()去找有沒有bar相同且baz不是null的存在

let result = foo.filter((item, index, array) => {
    if (item.baz === null) {
        let hasNonNullBaz = array.some(checkitem => checkitem.bar === item.bar && checkitem.baz != null);
        return !hasNonNullBaz;
    }
    return true;
});

參考資料:
Array.prototype.filter()
Array.prototype.some()

看更多先前的回應...收起先前的回應...
shiaobin iT邦新手 4 級 ‧ 2023-09-06 17:27:14 檢舉
let result = foo.filter((item, index, array) => {

請問這一行的 indexarray 是否為必要的?我試著把它們拿掉,改成以下程式碼,結果也是相同的。

let result = foo.filter((item) => {
    if (item.baz === null) {
        let hasNonNullBaz = foo.some(checkitem => checkitem.bar === item.bar && checkitem.baz != null)
        return !hasNonNullBaz
    }
    return true
})

如果沒有 indexarray,是否會有什麼問題是我沒注意到的?

Zero皇 iT邦研究生 3 級 ‧ 2023-09-06 18:35:32 檢舉

對可以拿掉,那個是可選的參數,那array就像你上面寫的改成原本的陣列就可以,差別在裡面的foo是寫死的,如果未來filter內的function要抽出來共用就會綁著foo,如果沒有這個需求那我會覺得兩種都可以

shiaobin iT邦新手 4 級 ‧ 2023-09-07 03:19:54 檢舉

解說非常清楚明瞭,謝謝!

Zero皇 iT邦研究生 3 級 ‧ 2023-09-07 07:18:15 檢舉

/images/emoticon/emoticon12.gif

我要發表回答

立即登入回答