Удалить циркуляр в объекте? - PullRequest
0 голосов
/ 05 мая 2019

Возможно ли удалить круговой тип, который находится внутри объекта?

скажем,

result = {
a : [Array],
b : [Object],
c : [Circular],
d : 'string'
e : {
  x : [Circular],
  y : {
    z : [Circular]
    }
}
}

до

result = {
    a : [Array],
    b : [Object],
    d : 'string'
    }

Я хотел отфильтровать всекруговой тип в объектах.

Попытка 1:

Поскольку имя для каждого объекта также является одинаковым в дочернем объекте.Я пытался удалить его, так как большинство детей круговой объект указывает только на родителей.(на самом деле, я запутался в этой части).Вот код, который я пытался использовать.

let keys = Object.keys(obj)
keys.forEach(val => {
    if (obj[val] instanceof Object || obj[val] instanceof Array) {
        Object.values(obj[val]).filter(function (value, index, arr) {
            if (keys.indexOf(Object.keys(value)[index]) > 0) {
                delete obj[val][index]
            }
        })
    }
})

1 Ответ

0 голосов
/ 05 мая 2019

Вы можете использовать набор для фильтрации объектов, которые видны дважды:

const noCirculars = v => {
  const set = new Set; 
  const noCirculars = v => {
    if(Array.isArray(noCirculars))
      return v.map(noCirculars);
    if(typeof v === "object" && v !== null) {
      if(set.has(v)) return undefined;
      set.add(v);

      return Object.fromEntries(Object.entries(v)
       .map(([k, v]) => ([k, noCirculars(v)])));
    }
    return v;
  };
  return noCirculars(v);
};
...