Как зациклить объект и удалить из него все функции - PullRequest
0 голосов
/ 05 января 2019

Давайте решим проблему, мне нужно удалить все функции из объекта для отправки через socket.io JSON! Допустим, у меня есть такой объект, как ...

let myObject = {
    test1: "abc",
    test2: function() {
        console.log("This is a function");
    },
    test3: {
        test4: "another string",
        test5: function() {
            console.log("another function");
        },
        test6: 123
    }
}

и мне тоже нужно конвертировать

let myObject = {
    test1: "abc",
    test3: {
        test4: "another string",
        test6: 123
    }
}

Я перепробовал много методов трески, но все они потерпели неудачу! Я бы опубликовал их, но это потратило бы ваше драгоценное время. Я бы любил любого, кто мог бы решить эту проблему аккуратно. С уважением, Джейкоб Моррис

P.S. Вот часть с ** р попытки сделать это

let myObject = {
  test1: "abc",
  test2: function() {
      console.log("This is a function");
  },
  test3: {
      test4: "another string",
      test5: function() {
          console.log("another function");
      },
      test6: 123
  }
}

let i = [];
function tsfr(ls) {
    let i = {};
    for (let a in ls) {
        if (typeof(ls[a]) !== "function") {
            let d = ls[a];
            if (typeof(d) == "object") {
                d = tsfr(d);
            }
            i[a] = d;
        }
    }
    return i;
}
i = tsfr(myObject);
console.log(i)

Ответы [ 5 ]

0 голосов
/ 05 января 2019

Это удалит все функции из вышеуказанного объекта

function removeFuncFromObj(obj) {
  Object.keys(obj).map((key) => {
    if (typeof obj[key] === "function") {
        delete obj[key];
    }
    if (typeof obj[key] === typeof {}) {
        removeFuncFromObj(obj[key]);
    }
  });
  return obj;
}
removeFuncFromObj(myObject);

[https://jsbin.com/favikej/edit?js,console,output][1]

0 голосов
/ 05 января 2019

Просто для удовольствия, я бы так сделал. Это пересмотр алгоритмов DOM Дугласа Крокфорда.

Во-первых, рекурсивная функция (visit()), которая посещает произвольный объект и применяет произвольную функцию к каждому члену:

function visit(obj, func)
{
  for (k in obj)
  {
    func(obj, k);

    if (typeof obj[k] === "object")
    {
      visit(obj[k], func);
    }
  }
}

Это рабочий пример с функцией полезной нагрузки, которая просто выводит найденные функции на консоль:

var testdata = {
  "a": 1,
  "b": "hello",
  "c": [ 1, 2, 3 ],
  "d": (x) => 2 * x,
  "e": null,
  "f": {
    "x": 10,
    "y": {
      "z": "$$$",
      "zz": (x) => 0
    }
  }
};

function visit(obj, func)
{
  for (k in obj)
  {
    func(obj, k);
    
    if (typeof obj[k] === "object")
    {
      visit(obj[k], func);
    }
  }
}

visit(testdata, (obj, k) => {
  if (typeof obj[k] === "function")
  {
    console.log(k + " is a function");
  }
});

Как показывает приведенный выше код, функция полезной нагрузки func способна находить все и только функции в объекте.

Все, что нам сейчас нужно, это функция, которая удаляет член, но сейчас это очень просто:

(obj, k) => {
  if (typeof obj[k] === "function")
  {
    delete obj[k];
  }
}

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

0 голосов
/ 05 января 2019

Вы можете использовать delete и рекурсивно удалять свойства вложенных объектов следующим образом:

let myObject = {
  test1: "abc",
  test2: function() {
    console.log("This is a function");
  },
  test3: {
    test4: "another string",
    test5: function() {
      console.log("another function");
    },
    test6: 123
  }
}

const deleteFunctions = (obj) => {
  Object.keys(obj).forEach(k => {
    if (typeof obj[k] === "function")
      delete obj[k];
    else if (typeof obj[k] === "object")
      deleteFunctions(obj[k])
  })
}

deleteFunctions(myObject)

console.log(myObject)
0 голосов
/ 05 января 2019

Вы можете отфильтровать пары ключ / значение, проверив тип, а затем отобразить новый объект, проверив вложенные объекты.

const
    removeFn = object => Object.assign(...Object
        .entries(object).filter(([k, v]) => typeof v !== 'function')
        .map(([k, v]) => ({ [k]: v && typeof v === 'object' ? removeFn(v) : v }))
    );

var object = { test1: "abc", test2: function() { console.log("This is a function"); }, test3: { test4: "another string", test5: function() { console.log("another function"); }, test6: 123 } };

console.log(removeFn(object));
0 голосов
/ 05 января 2019

Вы можете написать собственное рекурсивное решение, но я думаю, что лучше использовать JSON.stringify . По умолчанию stringify игнорирует функции и удаляет их из результата. В некоторых случаях это второй параметр, функция заменителя, который может пригодиться для более сложных манипуляций с объектами.

const removeFunctions = (obj) => {
  const stringified = JSON.stringify(obj);

  // We need to parse string back to object and return it
  const parsed = JSON.parse(stringified);

  return parsed;
}

const myObject = {
    test1: "abc",
    test2: function() {
        console.log("This is a function");
    },
    test3: {
        test4: "another string",
        test5: function() {
            console.log("another function");
        },
        test6: 123
    }
}

console.log(removeFunctions(myObject));

(или на codepen )

Обратите внимание, что при строковом преобразовании используется метод toString(), и в некоторых случаях пользовательские классы могут привести к потере данных. Чтобы предотвратить это, вам нужно написать собственное рекурсивное решение. Это, вероятно, будет намного сложнее.

Надеюсь, это поможет, ура!

РЕДАКТИРОВАТЬ: Я только что видел вашу попытку. Это шаг в правильном направлении, но ему нужно больше любви. Но я должен посоветовать вам против имен переменных, таких как tsfr или ls. Код становится намного более читабельным, если вы используете более длинные и описательные имена.

EDIT2: Как отметил Андреас в комментариях, вам даже не нужен собственный заменитель, так как stringify игнорирует их и удаляет их по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...