Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Конвертация массива (https://javascript.ru/forum/misc/82072-konvertaciya-massiva.html)

PetrIII 08.03.2021 10:43

Конвертация массива
 
Добрый день
Есть, например, массив ["1", "2", "3" ... N]
Нужно его преобразовать в объект вида:
{
col_1: "1",
col_2: "1.2",
col_3: "1.2.3",
col_N: "1.2.3...N"
}

как это лучше сделать?

voraa 08.03.2021 11:10

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);

PetrIII 08.03.2021 11:15

во, спасибо. А то реализовал через for(), но ваша реализация в одну строку лучше :)

рони 08.03.2021 11:18

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>

PetrIII 08.03.2021 11:20

и вам спасибо )

voraa 08.03.2021 12:40

Если уж так 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>

рони 08.03.2021 13:13

voraa,
массив может содержать не только числа но и текст

Alexandroppolus 09.03.2021 13:01

ещё вариант
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, т.е. сложность выглядит быть линейная.

рони 09.03.2021 16:14

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.