2013-08-08 3 views
0

У меня есть сложный вложенный объект JavaScript со мной. Требование состоит в том, чтобы полностью сгладить объект или только некоторые из его членов.Любая стандартная библиотека JavaScript для преобразования объектов JS

var obj = { 
    a: { 
     b: { 
      c: { 
      d: "Varun" 
      }, 
      e: "kumar" 
     } 
    } 
}; 

Ожидаемый результирующий объект:

{d: "Varun", e: "kumar"} 

Я написал простое преобразование утилита, которая будет принимать карту аксессора в виде { «ABCD»: «D»} и преобразовать объект в новый объект. Пока я не поддерживаю массивы. Кроме того, утилита преобразования может только свести сложный объект к более простой, а не наоборот (т. Е. Построить новый объект-член из простого элемента).

"use strict"; 
var ObjectUtil = (function() { 
    // constructor 
    var cls = function() { 

    }; 

    // public static 
    cls.getValueFromAccessor = function (obj, accessor) { 
     if (obj == null || accessor == null) 
      return null; 

     return accessor.split(".").reduce(function(prev, current, index) { 
      var reducedObject = prev; 
      if (index == 1) 
       reducedObject = obj[prev]; 

      if (reducedObject == null) 
       return null; 

      return reducedObject[current]; 
     }); 
    }; 

    cls.transform = function(obj, accessorMap, overlay) { 
     var result; 

     if (overlay) 
      result = obj; 
     else 
      result = {}; 

     for (var k in accessorMap) { 
      result[accessorMap[k]] = cls.getValueFromAccessor(obj, k); 
     } 

     return result; 
    }; 

    return cls; 
})(); 

var obj = { 
    a: { 
     b: { 
      c: { 
      d: "Varun" 
      }, 
      e: "kumar" 
     } 
    } 
}; 

var accessorMap = { 
    "a.b.c.d": "d", 
    "a.b.e": "e" 
} 

ObjectUtil.getValueFromAccessor(obj, "a.b.c.d"); 
console.log(ObjectUtil.transform(obj, accessorMap, false)); 
console.log(ObjectUtil.transform(obj, accessorMap, true)); 

Есть ли стандартный способ преобразования объектов из одной формы в другую. Любые библиотеки доступны для этого?

+0

[Нет такой вещи, как «объект JSON»] (http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/). Ваша проблема * * ничего * связана с JSON * вообще *. И JavaScript не имеет стандартной библиотеки. –

+0

Да, я это понимаю. Мой плохой для использования их взаимозаменяемо. –

+0

underscore.js - широко используемая библиотека для таких вещей. Выщипывание специальных свойств, сглаживание коллекций, отображение/уменьшение и т. Д. –

ответ

0
var converter = new (function(){ 
    var divider = "."; 
    var doFlatten = function(source, path, newObj){ 
     for(var i in source){ 
      if(source.hasOwnProperty(i)){ 
       var tempPath = (path == "") ? i : path + divider + i; 
       if(typeof source[i] == "object"){ 
        doFlatten(source[i], tempPath, newObj); 
       } 
       else{ 
        newObj[tempPath] = source[i]; 
       } 
      } 
     } 
    }; 
    this.flatten = function(source){ 
     if(typeof source == "object"){ 
      var newObj = {}; 
      doFlatten(source, "", newObj); 
      return newObj; 
     } 
     return source; 
    }; 
    this.expand = function(source){ 
     var dest = {}; 
     if(typeof source == "object"){ 
      for(var i in source){ 
       if(source.hasOwnProperty(i)){ 
        var path = i.split(divider); 
        var temp = dest; 
        var prevTemp = dest; 
        for(var j in path){ 
         if(!temp.hasOwnProperty(path[j])){ 
          temp[path[j]] = {}; 
         } 
         prevTemp = temp; 
         temp = temp[path[j]]; 
        } 
        prevTemp[path[path.length - 1]] = source[i]; 
       } 
      } 
      return dest; 
     } 
     return source; 
    }; 
}); 

Использование:

var flatObj = converter.flatten({ 
    a: { 
     b: { 
      c: { 
       d: "Varun" 
      }, 
      e: "kumar" 
     } 
    } 
}); 
console.log(flatObj); 
// {"a.b.c.d": "Varun", "a.b.e": "kumar"} 

var expanded = converter.expand(flatObj); 
console.log(expanded); 
// { 
// a: { 
//  b: { 
//   c: { 
//    d: "Varun" 
//   }, 
//   e: "kumar" 
//  } 
// } 
// } 
0

Взгляните на js-api-smith, он предлагает преобразования объектов JavaScript в декларативно. Он может быть установлен как NPM package, если вы используете его в браузере, вы можете использовать browserify.

Вот пример решения задачи в вашем вопросе:

const apiSmith = require('js-api-smith'); 
 

 
// one way 
 
const transformations1 = { 
 
    d: "a.b.c.d", 
 
    // d: ["a", "b", "c", "d"], // can also be written this way 
 
    e: "a.b.e" 
 
}; 
 

 
const from1 = { 
 
    a: { 
 
    b: { 
 
     c: { 
 
     d: "Varun" 
 
     }, 
 
     e: "kumar" 
 
    } 
 
    } 
 
}; 
 

 
const transformed1 = apiSmith.smash(transformations1, from1); 
 
// -> { d: "Varun", e: "kumar" } 
 

 
// or the other way 
 
const transformations2 = { 
 
    "a.b.c.d": "d", 
 
    "a.b.e": "e" 
 
}; 
 

 
const from2 = { d: "Varun", e: "kumar" }; 
 

 
const transformed2 = apiSmith.smash(transformations2, from2); 
 
// -> { 
 
// a: { 
 
//  b: { 
 
//  c: { 
 
//   d: "Varun" 
 
//  }, 
 
//  e: "kumar" 
 
//  } 
 
// } 
 
// };

Либерал также поддерживает настройки по умолчанию и определение функций преобразования на свойства, вы можете проверить the documentations, если вы заинтересованы.

Надеюсь, это поможет.

Смежные вопросы