0

Я кодирую приложение, где одна и та же структура данных сохраняется много раз. Укороченный пример:Преобразовать объект базы данных на считываемые ключи

user-xyz: { 
    displayName: 'Bla', 
    email: '[email protected]', 
    preferences: { 
     education: 'high' 
    } 
} 

Чтобы сохранить пропускную способность и хранение базы данных, я хотел «Минимизировать» мои ключи базы данных для:

user-xzy: { 
    dN: 'Bla', 
    e: '[email protected]' 
    p: { 
     e: 'high' 
    } 
} 

Теперь у меня есть проблема, что объекты поступают из базы данных в минимизирован и мне нужно переназначить правильные «полные» ключи, поэтому я могу нормально работать с объектом в своем приложении. Я не хочу работать с мини-версией, потому что для новых кодеров было бы намного сложнее.

Что такое хороший способ «перевести» объект, когда у меня есть два e (для пример) в качестве мини-ключа? Мне нужно каким-то образом включить структуру объекта в мою логику, чтобы выбрать соответствующий полный ключ.

EDIT: Ответ Redu решил эту проблему. Теперь я понял, что у меня иногда были объекты с меньшим количеством ключей, потому что база данных не сохранила бы значения «null». Ответ Redu больше не будет работать, потому что он использует индекс. Тем не менее, я был в состоянии изменить свое решение, так что все еще работает, когда ключи отсутствуют:

// mapping object 
var userXYZ = { 
    displayName: 'dN', 
    email: 'e', 
    preferences: 'p', 
    p: { 
    education: 'e' 
    } 
}; 

var userXYZMin = { 
    dN: 'myName', 
    // e: '[email protected]', -> missing key 
    p: { 
    e: 'elementary' 
    } 
}; 

var restoreKeys = function (original, minified) { 
    return Object.keys(original) 
    .reduce(function (o, k) { 
     if (typeof original[k] !== "object") 
     o[k] = (typeof minified[original[k]] !== "object" 
      ? minified[original[k]] || "" 
      : restoreKeys(original[original[k]], minified[original[k]]) || {}); 
     return o; 
    }, {}); 
}; 

Это просто для будущих поисковых запросов :)

ответ

1

При условии, что у вас нет дубликата ключей на том же уровне то вы можете сделать следующее:

function restoreKeys(original,minified){ 
 
    var oksm = Object.keys(minified); 
 
    return Object.keys(original) 
 
       .reduce((o,k,i) => typeof original[k] !== "object" ? (o[k] = minified[oksm[i]],o) 
 
                    : (o[k] = restoreKeys(original[k],minified[oksm[i]]),o),{}); 
 
} 
 

 
var userXYZ = { 
 
       displayName: 'Bla', 
 
        email: '[email protected]', 
 
       preferences: { 
 
          education: 'high' 
 
          } 
 
       }, 
 

 
userXYZMin = { 
 
       dN: 'myName', 
 
       e: '[email protected]', 
 
       p: { 
 
        e: 'elementary' 
 
        } 
 
      }, 
 

 
    restored = restoreKeys(userXYZ,userXYZMin); 
 
console.log(restored);

Ниже приводится ES5 совместимая версия

function restoreKeys(original,minified){ 
 
    var oksm = Object.keys(minified); 
 
    return Object.keys(original) 
 
       .reduce(function(o,k,i){ 
 
       \t   var oksm = Object.keys(minified); 
 
       \t   o[k] = typeof original[k] !== "object" ? minified[oksm[i]] 
 
                   : restoreKeys(original[k],minified[oksm[i]]); 
 
         return o; 
 
         }, {}); 
 
} 
 

 
var userXYZ = { 
 
       displayName: 'Bla', 
 
        email: '[email protected]', 
 
       preferences: { 
 
          education: 'high' 
 
          } 
 
       }, 
 

 
userXYZMin = { 
 
       dN: 'myName', 
 
       e: '[email protected]', 
 
       p: { 
 
        e: 'elementary' 
 
        } 
 
      }, 
 

 
    restored = restoreKeys(userXYZ,userXYZMin); 
 
console.log(restored);

+0

Это выглядит хорошо, но это возможно в EC5, а? (в синтаксисе функции) –

+1

@Yorick Tran Конечно ... второй фрагмент должен быть совместим с ES5. – Redu

+0

В частности, я не понимаю '(o [k] = minified [oksm [i]], o)' part, is ", o" переводится на "|| o"? –