08.03.2021, 10:43
|
Интересующийся
|
|
Регистрация: 27.06.2014
Сообщений: 12
|
|
Конвертация массива
Добрый день
Есть, например, массив ["1", "2", "3" ... N]
Нужно его преобразовать в объект вида:
{
col_1: "1",
col_2: "1.2",
col_3: "1.2.3",
col_N: "1.2.3...N"
}
как это лучше сделать?
|
|
08.03.2021, 11:10
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
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);
|
|
08.03.2021, 11:15
|
Интересующийся
|
|
Регистрация: 27.06.2014
Сообщений: 12
|
|
во, спасибо. А то реализовал через for(), но ваша реализация в одну строку лучше
|
|
08.03.2021, 11:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
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>
|
|
08.03.2021, 11:20
|
Интересующийся
|
|
Регистрация: 27.06.2014
Сообщений: 12
|
|
и вам спасибо )
|
|
08.03.2021, 12:40
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Если уж так 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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
voraa,
массив может содержать не только числа но и текст
|
|
09.03.2021, 13:01
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
ещё вариант
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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Alexandroppolus,
<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>
|
|
|
|