Saya cukup baru di JS dan ramda.js. Katakanlah saya memiliki objek yang terdiri dari objek kosong seperti ini:

obj = { 1: { }, 2: { }, 3: { } }

Dan array yang terdiri dari kunci yang dipilih dari obj .

arr = ['1', '2']

Yang saya butuhkan adalah membuat pasangan nilai kunci tertentu, misalnya a: 'value', di dalam objek kunci yang dipilih melalui arr, sehingga hasilnya akan terlihat seperti ini:

obj = { 
 1: { a: 'value' }, 
 2: { }, 
 3: { a: 'value' } 
}

Saya telah mencoba untuk .map melalui kunci dengan

arr.map(key => assocPath([key, 'a'], 'value', obj) )

, dan juga mencoba cara dengan arr.forEach(), tetapi tidak berhasil dan saya yakin saya mungkin kehilangan beberapa pengetahuan dasar? Atau adakah fungsi ramda.js alternatif yang harus saya gunakan?

0
Nanobrain91 29 Oktober 2019, 16:26

3 jawaban

Jawaban Terbaik

Lihatlah solusi saya

const object = { 1: { }, 2: { }, 3: { } }
const array = ['1', '3']

function magic(obj, arr) {
  return arr.reduce((acc, key) => ({
    ...acc,
    [key]: { a: 'value' },
  }), obj)
}

console.log(magic(object, array))

Ini juga dapat dicapai dengan fungsi ramda

const object = { 1: { }, 2: { }, 3: { } }
const array = ['1', '3']

const magicR = R.reduce((acc, key) => R.assocPath([ key, 'a' ], 'value', acc))

console.log(magicR(object, array))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
1
lankovova 29 Oktober 2019, 13:39

Metode Ramda tidak dapat diubah - mereka tidak mengubah objek asli, tetapi mengembalikan yang baru. Metode R.assocPath tidak berbeda dalam hal ini. Untuk memperbarui objek, Anda harus mengulangi array dengan R.reduce, menggunakan R.assocPath, mendapatkan objek baru, dll...

const { reduce, assocPath } = R

const fn = reduce((o, key) => assocPath([key, 'a'], 'value', o))

const obj = { 1: { }, 2: { }, 3: { } }
const arr = ['1', '2']

const result = fn(obj)(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
1
Ori Drori 29 Oktober 2019, 13:39

Anda harus dapat melakukan ini dengan .forEach():

arr.forEach(key => obj[key] = { a: 'value' });

Fungsi .map() adalah untuk membuat larik baru dari elemen larik sumber, dan Anda tidak perlu melakukannya.

1
Pointy 29 Oktober 2019, 13:29