Конвертация массива
Добрый день
Есть, например, массив ["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:20. |