Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2018, 19:06
Новичок на форуме
Отправить личное сообщение для quikki Посмотреть профиль Найти все сообщения от quikki
 
Регистрация: 11.08.2018
Сообщений: 4

Сериализация объекта (точнее даже десериализация).
var objNew = {
    text: {
        subText: {
            value: 'value1'
        },
        modificator: {
            name: 'name1',
            params: 'params1'
        }
    },
    attrs: {
        title: 'title1'
    }
};


obj2 = {
    'text.subText.value': 'value1',
    'text.modificator.name': 'name1',
    'text.modificator.params': 'params1',
    'attrs.title': 'title1'
};


Такая задачка, ребят, что нужно привести obj2 к objNew.

За несколько дней смог добиться некоторых успехов, но не понимаю, как можно реализовать глубину свойств (вложенность).

var obj4 = {};
var keysOfObj = [];
var valueOfObj = [];
var sum = 0;

function funBack(object) {

    //получаю значения свойств и записываю их в качестве элементов масива valueOfObj
    for (var key in object) {
        valueOfObj.push(object[key]);
    }


    //Ключи первоначального объекта записываю в качестве элементов массива keysOfObjWithDots
    var keysOfObjWithDots = [];
    keysOfObjWithDots = Object.getOwnPropertyNames(obj3);
    console.log(keysOfObjWithDots);



    //Ключи первоначального объекта записываю в качестве элементов массива keysOfObj (причём каждый элемент из keysOfObjWithDots представляет отдельный массив)
    for (var key1 = 0; key1 < keysOfObjWithDots.length; key1++) {
        keysOfObj.push(keysOfObjWithDots[key1].split('.'));
    }
    console.log(keysOfObj);


    //В каждый элемент (который является массивом) массива keysOfObj, добавляю последним элементом соответсвующее valueOfObj.
    for (var key2 = 0; key2 < keysOfObj.length; key2++) {
        keysOfObj[key2].push(valueOfObj[sum]);
        sum++;
    }
    //получаем обновлённый keysOfObj, который соответствует первоначальному объекту оформленному в виде массива. 
    console.log(keysOfObj);

    //---------------пытаюсь сделать функцию, которая через рекурсию будет добавлять свойства

    analize(obj4);

    function analize(object) {
        for (var key3 = 0; key3 < keysOfObj.length; key3++) {
            step:
            for (var key4 = 0; key4 < keysOfObj[key3].length; key4++) {
                
                if (!object.hasOwnProperty(keysOfObj[key3][key4]))
                {
                    object[keysOfObj[key3][key4]] = new Object(keysOfObj[key3][key4 + 1]); 
                }

            }


            // Удаляю из объекта каждое последнее свойство, которые были добавлены из многомерного массива keysOfObj, потому что они являются не свойствами, а значениями самых глубоких свойств. сравнить можно с picture1 (на рабочем столе)

            if (object.hasOwnProperty(keysOfObj[key3][keysOfObj[key3].length - 1])) {
                delete object[keysOfObj[key3][keysOfObj[key3].length - 1]];
            }
        }
    }
}
funBack(obj3);


и вот какой результат я получаю: Untitled.jpg

Думаю решение намного более элегантное, но пока я не умею красиво мыслить. Если кто-то заинтересуется и наставит, как справиться то буду очень благодарен)
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2018, 20:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

quikki,
<script>
  var objNew = {
    text: {
        subText: {
            value: 'value1'
        },
        modificator: {
            name: 'name1',
            params: 'params1'
        }
    },
    attrs: {
        title: 'title1'
    }
};
function fn(a) {
    var b = {},
        c;
    for (c in a) {
        var d = a[c];
        if ("object" == typeof d) {
            var e = true;
            Object.keys(d).forEach(function(a) {
                b[c + "." + a] = d[a]
            })
        } else b[c] = d
    }
    return e ? fn(b) : b
};
var obj = fn(objNew);
document.write(JSON.stringify(obj, null, 4))
  </script>
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2018, 20:03
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

var obj2 = {
    'text.subText.value': 'value1',
    'text.modificator.name': 'name1',
    'text.modificator.params': 'params1',
    'attrs.title': 'title1'
};

function expand(object) {
    var result = {};

    for(var key in object) {
        var context = result;
        var keys = key.split(".");
        var property = keys.pop();

        context = keys.reduce((m,v) => {
            return v in m ? m[v] : m[v] = {};
        }, context);

        context[property] = object[key];
    }

    return result;
}

alert(JSON.stringify(expand(obj2), null, "\t"));
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2018, 20:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

quikki,
<script>
  var objNew = {
    text: {
        subText: {
            value: 'value1'
        },
        modificator: {
            name: 'name1',
            params: 'params1'
        }
    },
    attrs: {
        title: 'title1'
    }
};
function fn(a) {
    //a = {...a}
    for (var b in a) {
        var c = a[b];
        if ("object" == typeof c) {
            var e = !0;
            Object.keys(c).forEach(function(d) {
                a[b + "." + d] = c[d]
            });
            delete a[b]
        }
    }
    return e ? fn(a) : a
};
var obj = fn(objNew);
document.write(JSON.stringify(obj, null, 4))
  </script>
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2018, 20:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

наоборот сделал ))) objNew в obj2
Ответить с цитированием
  #6 (permalink)  
Старый 11.08.2018, 20:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

quikki,
Генерация названий объектов - конкатенация названий объектов
Ответить с цитированием
  #7 (permalink)  
Старый 16.08.2018, 08:07
Новичок на форуме
Отправить личное сообщение для quikki Посмотреть профиль Найти все сообщения от quikki
 
Регистрация: 11.08.2018
Сообщений: 4

Сообщение от Malleys Посмотреть сообщение
context = keys.reduce((m,v) => {
            return v in m ? m[v] : m[v] = {};
        }, context);

        context[property] = object[key];
    }

    return result;
}

alert(JSON.stringify(expand(obj2), null, "\t"));

Можете объяснить эту часть кода, именно то что делает стрелочная функция, спасибо большое заранее)
Ответить с цитированием
  #8 (permalink)  
Старый 16.08.2018, 08:30
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

Это крутой уровень JS просто, им владеет рони и другие программисты. А мы из своей пещеры, почесывая дубинкой задницу используем обычные слова function или if else
(m,v) => {
 return v in m ? m[v] : m[v] = {};

//это все ровно что:

function (m){
   return v if(m){
       return m[v];
    }else{
        return  m[v] = {};
    }
}

может где то ошибся, но примерно так =)
=> в данном случае говорит что это функция, ? говорит что перед ним условие if , : говорит о том что это else

Хацкеры они все там, кто такое использует =))

Последний раз редактировалось Artur_Hopf, 16.08.2018 в 08:45.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сериализация сложного js объекта uncher4 AJAX и COMET 14 25.10.2013 19:03
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00