ยกระดับของคีย์ให้อยู่ในระดับสูงสุดขณะเดียวกันก็รักษาส่วนที่เหลือของวัตถุโดยใช้ Ramda

2020-02-15 javascript functional-programming ramda.js

ฉันต้องการสร้างมันลงในฟังก์ชั่นการ compose ของฉันเพื่อให้ค่าของ record ไปถึงระดับสูงสุดของวัตถุในขณะที่ปุ่มอื่น ๆ ยังคงอยู่

{
  record: {
    seasons: [
      1
    ],
    colors: [
      2
    ]
  },
  tag_ids: [
    2091
  ]
}

ผลที่ตามมาคือ:

{
  seasons: [
    1
  ],
  colors: [
    2
  ],
  tag_ids: [
    2091
  ]
}

ปุ่มใดก็ได้ อาจมี หรือ ไม่มี ก็ได้

ฉันมักจะเกาหัวของฉันด้วยวิธี ramda ที่จะทำในฟังก์ชั่นการ compose ขณะนี้ฉันกำลังมองหา toPairs และทำการแปลงร่างที่ค่อนข้างยาวที่ไม่มีโชค

Answers

คุณสามารถใช้โอเปอเรเตอร์การแพร่กระจาย

const startingWithAllProps = {
  record: {
    seasons: [
      1
    ],
    colors: [
      2
    ]
  },
  tag_ids: [
    2091
  ]
}

const startingWithoutRecord = {
  tag_ids: [
    2091
  ]
}

const startingWithoutTagIds = {
  record: {
    seasons: [
      1
    ],
    colors: [
      2
    ]
  }
}

const moveRecordUpOneLevel = (startingObject) => {
  const temp = {
    ...startingObject.record,
    tag_ids: startingObject.tag_ids
  }
  return JSON.parse(JSON.stringify(temp)) // To remove any undefined props
}

const afterTransformWithAllProps = moveRecordUpOneLevel(startingWithAllProps)
const afterTransformWithoutRecord = moveRecordUpOneLevel(startingWithoutRecord)
const afterTransformWithoutTagIds = moveRecordUpOneLevel(startingWithoutTagIds)

console.log('afterTransformWithAllProps', afterTransformWithAllProps)
console.log('afterTransformWithoutRecord', afterTransformWithoutRecord)
console.log('afterTransformWithoutTagIds', afterTransformWithoutTagIds)

สิ่งนี้อาจง่ายกว่าใน JS ธรรมดาแทนที่จะ Ramda:

const data = { record: { seasons: [1], colors: [2] }, tag_ids: [2091] }

const flattenRecord = ({record = {}, ...rest}) => ({...record, ...rest})

flattenRecord(data) //=> {"colors": [2], "seasons": [1], "tag_ids": [2091]}

หากคุณยังต้องการใช้ Ramda สำหรับการแก้ปัญหาให้พิจารณาดูที่ R.mergeLeft (หรือ R.mergeRight ) และ R.omit

คุณสามารถใช้ R.chain กับ R.merge และ R.prop เพื่อทำให้เนื้อหาของคีย์แบนขึ้นโดยการรวมเข้ากับวัตถุดั้งเดิมจากนั้นคุณสามารถละเว้นรหัสเดิมได้

const { pipe, chain, merge, prop, omit } = R

const fn = key => pipe(
  chain(merge, prop(key)), // flatten the key's content
  omit([key]) // remove the key
)

const data = { record: { seasons: [1], colors: [2] }, tag_ids: [2091] }

const result = fn('record')(data)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>

นี่อาจช่วยด้วย!

const lift = key => R.converge(R.mergeRight, [
  R.dissoc(key),
  R.prop(key),
]);

const liftRecord = lift('record');

// ====
const data = {
  record: {
    seasons: [
      1
    ],
    colors: [
      2
    ]
  },
  tag_ids: [
    2091
  ]
};

console.log(
  liftRecord(data),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>

Related