Преобразовать объект в объект, для которого существует свойство «равный», в значение «равно» - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть глубокий объект, такой как cats ниже, и я ищу простой способ глубокого удаления всех свойств, если вложенное свойство имеет значение equal.

const cats = {
  love: {
    meow: {
      equal: 2,
    },
    dolphin: {
      hi: 'meow',
    },
    doggo: true,
    soup: undefined,
    vampire: {},
    deep: {
      ocean: {
        love: {
          equal: 'hi',
        },
      },
    },
  },
};

.:

const cats = {
  love: {
    meow: 2,
    deep: {
      ocean: {
        love: 'hi',
      },
    },
  },
};

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Используя ответ @ OriDori, я настроил его так, чтобы он не устанавливал пустой / нежелательный реквизит.

const fn = collection => lodash.transform(collection, (r, v, k) => {
  if (lodash.isPlainObject(v)) {
    if (lodash.has(v, 'equal')) {
      r[k] = lodash.get(v, 'equal');
    } else {
      const d = fn(v);
      if (lodash.size(d)) {
        r[k] = d;
      }
    }
  }
});
0 голосов
/ 06 февраля 2019

Вы можете использовать рекурсив _.transform():

const cats = {
  love: {
    meow: {
      equal: 2,
    },
    dolphin: {
      hi: 'meow',
    },
    doggo: true,
    soup: undefined,
    vampire: {},
    deep: {
      ocean: {
        love: {
          equal: 'hi',
        },
      },
    },
  },
};

const fn = (collection) => _.transform(collection, (r, v, k) => {
  if(_.isArray(v)) r[k] = fn(v);
  else if (_.isObject(v)) {
    if(_.has(v, 'equal')) r[k] =  _.get(v, 'equal');
    else {
      const value = fn(v);
      if(!_.isEmpty(value)) r[k] = value; 
    }
  } else if(!_.isUndefined(v)) r[k] = v;
});

const result = fn(cats);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...