2016-07-08 3 views
1

Скрипт ниже в настоящее время выдает:цикл через объекты внутри объекта с Object.assign

{ 
    "title1": { 
     "0": "undefined" 
    }, 
    "title2": "& three", 
    "title3": "& four" 
} 

Нужный выход существо:

{ 
     "title1": { 
     "nested1": "one", 
     "nested2": "& two" 
     }, 
     "title2": "& three ", 
     "title3": "& four" 
    } 

Мой вопрос, что требуется, если заявление успешно прокрутите свойства [key] [innerKey] и передайте их через функцию кодирования и верните их в 'out'?

Я пытался решить его, используя цикл for в первой части инструкции if без успеха. Я полагаю, что она должна следовать логике вдоль линий:

  • , если обр [ключ] является объектом, то
  • выводить [ключ]:
  • затем цикл через все свойства [ключ]
  • и передавать их через функцию кодирования
  • и вернуть их в «вне»

спасибо.

var arr = { 
    "title1": { 
    "nested1": "one", 
    "nested2": "& two" 
    }, 
    "title2": "& three ", 
    "title3": "& four" 
}; 

var encodedValues = Object.keys(arr).reduce(function(out,key,innerKey) { 

    if (typeof arr[key] == "object") { 
    return Object.assign(out, {[key]: {[innerKey]: encode(arr[key][innerKey])}}) 

    } else { 
    return Object.assign(out, {[key]: encode(arr[key])}) 
    } 

}, {}); 

console.log(encodedValues) 
+0

Можете ли вы разместить ожидаемый результат? Я не понимаю, чего вы пытаетесь достичь ... – rpadovani

+1

Да Конечно. Извините за отсутствие ясности. Просто обновил исходное сообщение. – fivedoor

+0

Является ли глубина объекта всегда равным == 1? – markusthoemmes

ответ

1

Как насчет этого? (рекурсия)

var arr = { 
    "title1": { 
    "nested1": "one", 
    "nested2": "& two" 
    }, 
    "title2": "& three ", 
    "title3": "& four" 
}; 

var encode = function(val){ return encodeURI(val) }; 

var encodeValues = function(arr){ 
    var obj = {}; 
    for(var key in arr){ 
    if(typeof arr[key] == "object"){ 
     obj[key] = encodeValues(arr[key]); 
    }else{ 
     obj[key] = encode(arr[key]); 
    } 
    } 
    return obj; 
}; 

var encodedValues = encodeValues(arr); 

console.log(encodedValues); 
+0

Thankyou. Это было отлично, когда я тестировал. Так будет ли это быть рекурсивной функцией, поскольку вы ссылаетесь на encodeValues ​​внутри функции, и она возвращается к самому себе? – fivedoor

+0

Точно. Я перехожу к возможности использовать рекурсию: p –

2

Я думаю, что что-то, как это должно работать:

function encodeValues(arr) { 
    Object.keys(arr).forEach(item => { 
    if (typeof arr[item] === "object") encodeValues(arr[item]); 
    else arr[item] = encode(arr[item]); 
    }); 
    return arr; 
} 

var encodedValues = encodeValues(arr); 

же код в ES5:

function encodeValues(arr) { 
    var keys = Object.keys(arr); 
    for (var i = 0; i < keys.length; i++) { 
    if (typeof arr[keys[i]] === "object") encodeValues(arr[keys[i]]); 
    else arr[keys[i]] = encode(arr[keys[i]]); 
    } 
return arr; 
} 

var encodedValues = encodeValues(arr); 

Это может работать на любой глубине у вас есть (объекты вложены в другие объекты)

+0

Большое спасибо. Как ни странно, я просто дал ему понять, как выше, так и console.log (encodedValues); возвращается неопределенно. будет двойной проверки. – fivedoor

+0

@fivedoor ups, извините, я не тестировал версию ES5, и я сделал ошибку, написав для нее, теперь она должна работать! – rpadovani

+0

ах, да, жаль, что я просто набросился на решение Пата тем временем - теперь это тоже отлично. Спасибо за вашу помощь! – fivedoor

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