簡體   English   中英

如何在 javascript 中深度嵌套的對象成員上使用 Ramda 的 omit() 函數

[英]How can I use Ramda's omit() function on a deeply nested object member in javascript

我有一種情況,我想在展平和導出到 CSV 之前刪除對象樹的任何部分。 Ramda是我在 JS 中為FP選擇的庫,但我注意到R.omit()函數僅在目標對象的一層深度起作用。 我怎樣才能做到以下幾點?

const R = require('ramda');

const obj = {
    id: 1,
    name: 'me',
    audience_sizes: {
        fb: 500,
        dfp: 2000,
        apn: 1800
    }
};

console.log(JSON.stringify(R.omit(['id', 'audience_sizes.fb'], obj)));

我希望得到以下結果:

{"name":"me","audience_sizes":{"dfp":2000, "apn": 1800}}

我認為Lenses是一種更實用的方法。

R.over(R.lensProp('audience_sizes'), R.omit(['fb']), R.omit(['id'], obj));

DissocPath看起來像您要找的東西。 使用它或鏡頭進行更復雜的深度更新。

我通過使用以下功能解決了這個問題。 在下面的解決方案中,如何避免使用eval()處理對象成員的深層引用? 基本上,我正在尋找一種更好的方法來實現此功能:

//This is a supplemental function to Ramda's omit(), which allows deep key referencing
export const omitDeep = R.curry((keys, obj) => {
  if(!keys || keys.length===0) return obj;
  let newObj = Object.assign({}, obj);
  keys.forEach( key => {
      let keyParts = key.split('.');
      if(keyParts.length < 2) {
          newObj = R.omit(keyParts, newObj);
          return;
      }
      let target = newObj[keyParts[0]];
      let objString = `newObj.${keyParts[0]}`;
      for(let i=1; i < keyParts.length - 1; i++){
          target = target[keyParts[i]];
          objString += `.${keyParts[0]}`;
      }
      const subj = keyParts[keyParts.length-1];
      target = R.omit([subj], target);
      eval(`${objString} = target`);
   });
   return newObj;
});

謝謝!

根據更多經驗豐富的omitDeep用戶的建議,我將omitDeep函數重構如下:

//This is a supplemental function to Ramda's omit(), which allows deep key referencing
export const omitDeep = R.curry((keys, obj) => {
  if(!keys || keys.length===0) return obj;
  let newObj = R.clone(obj);
  keys.forEach( key => {
      let keyParts = key.split('.');
      newObj = R.dissocPath(keyParts, newObj);
  });    
  return newObj;
});

謝謝@Buggy和@Ebuall!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM