Diberikan struktur data berikut.

let hall = Map({
  tables: Map({
    t1: Map({
      playlist: List(
        Map({
          songid: 'target'
        })
      )
    }),
    t2: Map({
      playlist: List(
        Map({
          songid: 'not me'
        })
      )
    })
  })
});

Bagaimana cara saya mengulangi setiap tabel (t1, t2, ...) dan menghapus item dalam daftar dengan songid === 'target' sehingga saya berakhir dengan:

let expected_hall = Map({
  tables: Map({
    t1: Map({
      playlist: List()
    }),
    t2: Map({
      playlist: List(
        Map({
          songid: 'not me'
        })
      )
    })
  })
});

Mencoba yang berikut ini tidak berhasil:

let res = hall;
hall.get('tables').entrySeq().forEach(e => {
  res = res.updateIn(['tables', e[0], 'playlist'], list => list.filter(songinfo => songinfo.songid === 'target'));
});

// or using  hall.get('tables').map(...)

Menghargai atas semua bantuan yang diberikan.

1
adsisco 11 Agustus 2017, 12:18

2 jawaban

Jawaban Terbaik
let hall = Map({
  tables: Map({
    t1: Map({
      playlist: List.of(
        Map({
          songid: 'target'
        })
      )
    }),
    t2: Map({
      playlist: List.of(
        Map({
          songid: 'not me'
        })
      )
    })
  })
});

Cara Anda menggunakan List, seharusnya List.of(...) atau List([])

Saya akan melakukannya seperti ini:

const hall2 = hall.update("tables", tables => (
  tables.map(table => (
    table.update("playlist", playlist => playlist.filter(p => p.get("songid")!=="not me"))
  ))
));

Anda memperbarui properti tabel, mengulangi setiap tabel, memperbarui properti daftar putar, dan memfilter daftar putar berdasarkan setiap item agar tidak menjadi "bukan saya"

1
shtanton 11 Agustus 2017, 19:07

Dokumen List#filter

Mengembalikan Daftar baru dengan hanya nilai yang fungsi predikatnya mengembalikan true.

Jadi di sini kita harus mengembalikan daftar mana yang songid BUKAN target

let res = hall;
hall.get('tables').keySeq().forEach(e => {
  res = res.updateIn(['tables', e, 'playlist'], list => list.filter(info => info.get("songid") !== "target"));
});
-1
An Nguyen 11 Agustus 2017, 14:52