2015-05-21 3 views
-2

СFlatten на основе одноразового ключа

{ _id: "123", super: { super: { super: { someString: "here", someOtherString: "here", someObject: { withSomeContents: true }}}}}

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

{ _id: "123", someString: "here", someOtherString: "here", someObject: { withSomeContents: true }}

Каков хороший способ сделать это? Предпочтительно использовать подчеркивание.

+0

Просто любопытно - как же вам удалось получить объект как то, что мы видим здесь? –

+0

Определите свою проблему немного лучше. Так это только в том случае, если вы хотите, чтобы свойства с самого глубокого уровня сглаживались до верхнего уровня? Или могут быть другие свойства на промежуточных уровнях, которые необходимо сгладить? Возможно ли, что некоторые из этих имен свойств могут столкнуться? Как это будет обрабатываться? –

+0

определить «хороший способ». Есть очевидный, который не слишком длинный, используя явную итерацию. –

ответ

3

Вам нужно объединить объекты рекурсивно, при проверке нужного ключа:

var data = { 
 
    _id: "123", 
 
    super: { 
 
    super: { 
 
     super: { 
 
     someString: "here", 
 
     someOtherString: "here", 
 
     someObject: { 
 
      withSomeContents: true 
 
     } 
 
     } 
 
    } 
 
    } 
 
}; 
 

 
function merge(dest, src) { 
 
    Object.keys(src).forEach(function(key) { 
 
    dest[key] = src[key]; 
 
    }); 
 
} 
 

 
function flattenKey(data, flatKey) { 
 
    return Object.keys(data).reduce(function(obj, key) { 
 
    if (key === flatKey) { 
 
     merge(obj, flattenKey(data[key], flatKey)); 
 
    } else { 
 
     obj[key] = data[key]; 
 
    } 
 
    return obj; 
 
    }, {}); 
 
} 
 

 
document.getElementById('r').textContent = JSON.stringify(flattenKey(data, 'super'));
<pre id=r></pre>

+0

Отлично. Большое спасибо. Пробовал поиск, но не был уверен, были ли какие-то регулярно используемые подходы, такие как цепочка в подчеркивании или подобном. – jiku

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