Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.03.2021, 10:43
Интересующийся
Отправить личное сообщение для PetrIII Посмотреть профиль Найти все сообщения от PetrIII
 
Регистрация: 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"
}

как это лучше сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 08.03.2021, 11:10
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,714

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);
Ответить с цитированием
  #3 (permalink)  
Старый 08.03.2021, 11:15
Интересующийся
Отправить личное сообщение для PetrIII Посмотреть профиль Найти все сообщения от PetrIII
 
Регистрация: 27.06.2014
Сообщений: 12

во, спасибо. А то реализовал через for(), но ваша реализация в одну строку лучше
Ответить с цитированием
  #4 (permalink)  
Старый 08.03.2021, 11:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

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>
Ответить с цитированием
  #5 (permalink)  
Старый 08.03.2021, 11:20
Интересующийся
Отправить личное сообщение для PetrIII Посмотреть профиль Найти все сообщения от PetrIII
 
Регистрация: 27.06.2014
Сообщений: 12

и вам спасибо )
Ответить с цитированием
  #6 (permalink)  
Старый 08.03.2021, 12:40
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,714

Если уж так 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>
Ответить с цитированием
  #7 (permalink)  
Старый 08.03.2021, 13:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

voraa,
массив может содержать не только числа но и текст
Ответить с цитированием
  #8 (permalink)  
Старый 09.03.2021, 13:01
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

ещё вариант
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, т.е. сложность выглядит быть линейная.
Ответить с цитированием
  #9 (permalink)  
Старый 09.03.2021, 16:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите , элементы массива по порядку из другого массива Rost_shat Javascript под браузер 9 28.07.2018 20:03
Соединение массива Artur_Hopf Общие вопросы Javascript 4 07.06.2018 16:48
Обход многомерного массива с задержкой после каждого цикла Walk Общие вопросы Javascript 2 14.08.2017 16:17
Помогите к js коду, написать html код Modrih Элементы интерфейса 8 16.06.2015 18:08
конвертация сложного массива в строку и назад Leax Общие вопросы Javascript 2 01.04.2010 18:17