Конвертация массива
Добрый день
Есть, например, массив ["1", "2", "3" ... N] Нужно его преобразовать в объект вида: { col_1: "1", col_2: "1.2", col_3: "1.2.3", col_N: "1.2.3...N" } как это лучше сделать? |
let arr = ["1", "2", "3", "4","5"] let s='' let obj = arr.reduce ((o, v) => (s=s? s+'.'+v: v , o['col_'+v] = s, o), {}); console.log(obj); |
во, спасибо. А то реализовал через for(), но ваша реализация в одну строку лучше :)
|
PetrIII,
<script> let arr = ["1", "2", "3", "4", "5"] let obj = arr.reduce ((o, v, i) => (o['col_'+v] = arr.slice(0, ++i).join('.'), o), {}); document.write(`<pre>${JSON.stringify(obj, '', 2)}</pre>`) </script> |
и вам спасибо )
|
Если уж так s не нравится, то так эффективнее будет
<script> let arr = ["1", "2", "3", "4","5"] let obj = arr.reduce ((o, v, i) => (o['col_'+v] = i? o['col_'+(v-1)]+'.'+v: v, o), {}); document.write(`<pre>${JSON.stringify(obj, '', 2)}</pre>`) </script> |
voraa,
массив может содержать не только числа но и текст |
ещё вариант
function toObj(arr) { const str = arr.join('.'); const obj = {}; let len = -1; for (let i = 0; i < arr.length; ++i) { len += arr[i].length + 1; obj['col_' + (i + 1)] = str.substr(0, len); } return obj; } alert(JSON.stringify(toObj(['1', '2', '3', '4']), '', 4)); по идее, должно быть более экономным по памяти: если предположить, что join реализовано оптимально, то сразу выделяется подходящего размера буфер под строку, который потом переиспользуется в строках, созданных через substr, т.е. сложность выглядит быть линейная. |
Alexandroppolus,
:) :write: <script> function toObj(arr) { let str = arr.join('.'); const obj = {}; for (let i = arr.length; i ; ) { obj['col_' + i--] = str; str = str.slice(0,-(arr[i].length + 1)); } return obj; } document.write(`<pre>${JSON.stringify(toObj(['1', '2', '3', '4']), '', 2)}</pre>`) </script> |
Часовой пояс GMT +3, время: 06:28. |