Раньше в Visualforce различные типы данных хранились в буфере контроллера.
Можно было в любой момент обратиться к любой мапе, листу и тд.
Сейчас же постоянного доступа к контроллеру нет и голова не варит как теперь быть.
Есть несколько этап обработки данных:
1) Загрузить файл. Файл в Apex конвертируется из CSV в Map. Возвращает Map в JS контроллер. Map итерируется на странице, показывает состав данных, отфильтрованный и отформатированный как таблица.
2) Смотрим на таблицу, если все устраивает, то нажимаем кнопку "Добавить прогресс в запись". Сейчас бы не помешало в буфере висеть этой Map, но так как обращаемся заново к Apex, эту Map нужно конвертировать из CSV (по старой ссылке на файл) в Map. Добавляется статистику вида (Россия=55, Украина=60) в 1 из полей записи.
3)Нажимаем отправить емейлы. По идее опять карта пригодится чтоб просто в метод апекса ее передать и выполнять пакет SingleEmailMessage. Но кажется опять нужно из того же CSV в Map форматировать.
Вопрос - где я загнался и как облегчить жизнь?
Раньше в Visualforce различные типы данных хранились в буфере контроллера. Можно было в любой момент обратиться к любой мапе, листу и тд. Сейчас же постоянного доступа к контроллеру нет и голова не варит как теперь быть. Есть несколько этап обработки данных: 1) Загрузить файл. Файл в Apex конвертируется из CSV в [color=red]Map[/color]. Возвращает Map в JS контроллер. Map итерируется на странице, показывает состав данных, отфильтрованный и отформатированный как таблица. 2) Смотрим на таблицу, если все устраивает, то нажимаем кнопку "Добавить прогресс в запись". Сейчас бы не помешало в буфере висеть этой [color=red]Map[/color], но так как обращаемся заново к Apex, эту Map нужно конвертировать из CSV (по старой ссылке на файл) в Map. Добавляется статистику вида (Россия=55, Украина=60) в 1 из полей записи. 3)Нажимаем отправить емейлы. По идее опять [color=red]карта[/color] пригодится чтоб просто в метод апекса ее передать и выполнять пакет SingleEmailMessage. Но кажется опять нужно из того же CSV в Map форматировать. Вопрос - где я загнался и как облегчить жизнь?
Ну можно заново парсить CSV
Можно отправить мапу из js controller в apex обратно
Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом
Ну можно заново парсить CSV Можно отправить мапу из js controller в apex обратно Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом
Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом
Привет, спасибо!
А как несколько объектов отправляешь из апекса, мапой? Например мапу и стринг нужно вернуть, делаешь мап<мап, стринг>?
[quote="Maxim Elets"]Ну можно заново парсить CSV Можно отправить мапу из js controller в apex обратно Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом[/quote] Привет, спасибо! А как несколько объектов отправляешь из апекса, мапой? Например мапу и стринг нужно вернуть, делаешь мап<мап, стринг>?
Я не знаю как делают другие, я то делаю public static Map<String, Object> get(){}
и возвращаю мапу на фронтед.
Можно делать врапперы, но мне лень:)
Я не знаю как делают другие, я то делаю public static Map<String, Object> get(){} и возвращаю мапу на фронтед. Можно делать врапперы, но мне лень:)
Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода.
В твоем случае надо теперь ручками это делать в JS.
Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять.
На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных.
вот Apex наверное самые полезные команды:
Map<String, Object> map = new Map<String, Object>();
String str = JSON.serialize(map);
Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str);
WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class);
А в JS:
JSON.stringity(obj);
JSON.parse(str);
Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных.
Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).
[quote="Ivan Sokolov"]Раньше в Visualforce различные типы данных хранились в буфере контроллера.[/quote] Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода. В твоем случае надо теперь ручками это делать в JS. Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять. На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных. вот Apex наверное самые полезные команды: [code] Map<String, Object> map = new Map<String, Object>(); String str = JSON.serialize(map); Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str); WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class); [/code] А в JS: [code] JSON.stringity(obj); JSON.parse(str); [/code] Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных. Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).
В твоем случае надо теперь ручками это делать в JS.
Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять.
На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных.
вот Apex наверное самые полезные команды:
Map<String, Object> map = new Map<String, Object>();
String str = JSON.serialize(map);
Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str);
WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class);
А в JS:
JSON.stringity(obj);
JSON.parse(str);
Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных.
Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).
Дмитрий, спасибо!
Хорошо, что я не первый , вступивший в терру инкогнито))
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)
[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]Раньше в Visualforce различные типы данных хранились в буфере контроллера.[/quote] Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода. В твоем случае надо теперь ручками это делать в JS. Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять. На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных. вот Apex наверное самые полезные команды: [code] Map<String, Object> map = new Map<String, Object>(); String str = JSON.serialize(map); Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str); WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class); [/code] А в JS: [code] JSON.stringity(obj); JSON.parse(str); [/code] Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных. Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).[/quote] Дмитрий, спасибо! Хорошо, что я не первый , вступивший в терру инкогнито)) А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)
Не, я только могу указать путь, а пройти его придется самому
[quote="Ivan Sokolov"]А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)[/quote] Не, я только могу указать путь, а пройти его придется самому :D :D :D
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)
Не, я только могу указать путь, а пройти его придется самому :D
Тоже дело хорошее.
Ну это совместно используется или каждая строка для разных целей?
[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)[/quote] Не, я только могу указать путь, а пройти его придется самому :D :D :D[/quote] Тоже дело хорошее. Ну это совместно используется или каждая строка для разных целей?
Ну это совместно используется или каждая строка для разных целей?
Без обид, но у меня на этот вопрос только один ответ в голове созрел
Это строки двух разных молитв, которые надо произносить перед тем как садишься писать код и как заканчиваешь, чтобы не спугнуть дух бабла которое сыпется из ИТ просто за то что у тебя есть комп.
А если серьезно. Садимся и изучаем что такое ООП, классы, объект, что такое JSON и зачем он нужен, что такое сериализация и десериализация объектов, как данные перемещаются между сервером и клиентом.
[quote="Ivan Sokolov"]Ну это совместно используется или каждая строка для разных целей?[/quote] Без обид, но у меня на этот вопрос только один ответ в голове созрел :D Это строки двух разных молитв, которые надо произносить перед тем как садишься писать код и как заканчиваешь, чтобы не спугнуть дух бабла которое сыпется из ИТ просто за то что у тебя есть комп. А если серьезно. Садимся и изучаем что такое ООП, классы, объект, что такое JSON и зачем он нужен, что такое сериализация и десериализация объектов, как данные перемещаются между сервером и клиентом.
А, извини! Возможно для LWC все это не нужно и я только запутываю. Я просто с LWC не работаю вообще
Но так для общего развития может пригодится
А, извини! Возможно для LWC все это не нужно и я только запутываю. Я просто с LWC не работаю вообще :D Но так для общего развития может пригодится :)
APEX:
Map<String, List<Map<String,String>>> returnedMap = new Map<String, List<Map<String,String>>>();
returnedMap.put(newValue, reportData.values());
return JSON.serialize(returnedMap);
LWC JS:
.then(result => {var mapFromApex = JSON.parse(result);
// Если вывести в лог будет то, что отправлено с апекса, в верном формате -
// {
// "Russian Federation,0\n" - String
// :
// [{"fullname":"Employee FN","Manager Email":"n@lil.com","Country":"Russian Federation","Device Model":"iPhone 18","OS Version":"15","Email":"n@lil.com"}] - List<Map<String,String>>
// }var mapsList;
for (var key in mapFromApex) {
this.progressStatus = key; - ЗДЕСЬ НОРМАЛЬНО ПРИСВАЕВАЕТСЯ
alert('value = ' + JSON.stringify(mapFromApex[key]));
mapsList = mapFromApex[key];
}for (var mapItem in mapsList) {
alert('mapItem = ' + JSON.stringify(mapItem)); - здесь выводит номер строки по порядку, хотя никаких таких значений там не содержится.
}
Вопрос - как обработать Value возвращенной из Apex карты, чтобы сделать итерации по строкам CSV и по заголовку-значению (Map <String, String>) в HTML?
Спасибо!
[b]APEX:[/b] [code] Map<String, List<Map<String,String>>> returnedMap = new Map<String, List<Map<String,String>>>(); returnedMap.put(newValue, reportData.values()); return JSON.serialize(returnedMap); [/code] [b]LWC JS:[/b] [code] .then(result => { var mapFromApex = JSON.parse(result); // Если вывести в лог будет то, что отправлено с апекса, в верном формате - // { // "Russian Federation,0\n" - String // : // [{"fullname":"Employee FN","Manager Email":"n@lil.com","Country":"Russian Federation","Device Model":"iPhone 18","OS Version":"15","Email":"n@lil.com"}] - List<Map<String,String>> // } var mapsList; for (var key in mapFromApex) { this.progressStatus = key; - ЗДЕСЬ НОРМАЛЬНО ПРИСВАЕВАЕТСЯ alert('value = ' + JSON.stringify(mapFromApex[key])); mapsList = mapFromApex[key]; } for (var mapItem in mapsList) { alert('mapItem = ' + JSON.stringify(mapItem)); - здесь выводит номер строки по порядку, хотя никаких таких значений там не содержится. } [/code] [b]Вопрос[/b] - как обработать [b]Value[/b] возвращенной из Apex карты, чтобы сделать итерации по строкам CSV и по заголовку-значению (Map <String, String>) в HTML? Спасибо!
Окей. Ошибка была в последнем цикле.
Лист итерируется циклом for:
for (var i = 0; i < mapsList.length; i++) {
for (var key in mapsList[i]) {
alert('key in ' + i + ' map = ' + key);
}
}
Окей. Ошибка была в последнем цикле. Лист итерируется циклом for: [code] for (var i = 0; i < mapsList.length; i++) { for (var key in mapsList[i]) { alert('key in ' + i + ' map = ' + key); } }[/code]
Для перебора массива(list|array) в JS надо использовать:
for (var mapItem of mapsList)
Супер! Вижу прогресс в JSON сериализации/десериализации! Все правильно сделал
Только когда дебажешь в браузере не надо использовать alert!
используй console.log и без "+ JSON.stringify" - так намного удобнее и правильнее
Для перебора массива(list|array) в JS надо использовать: for (var mapItem [color=red][b]of[/b][/color] mapsList) Супер! Вижу прогресс в JSON сериализации/десериализации! Все правильно сделал Только когда дебажешь в браузере не надо использовать alert! используй console.log и без "+ JSON.stringify" - так намного удобнее и правильнее
for (var mapItem of mapsList)
Спасибо, и правда "of"
А как же без stringify?
объект так не получается вывести:
console.log('mapItem = ' + mapItem);
[quote="Dmitry Shnyrev"]for (var mapItem of mapsList)[/quote] Спасибо, и правда "[b]of[/b]" А как же без stringify? объект так не получается вывести: [code]console.log('mapItem = ' + mapItem);[/code] даёт результат - mapItem = [object Object]
console.log('mapItem =', mapItem);
Не надо складывать! Все что надо вывести, через запятую.
или просто
console.log(mapItem);
console.log('mapItem ='[color=red],[/color] mapItem); Не надо складывать! Все что надо вывести, через запятую. или просто console.log(mapItem);
console.log('mapItem =', mapItem);
Не надо складывать! Все что надо вывести, через запятую.
или просто
console.log(mapItem);
Спасибо, чудеса! Вот так денек!
Входные данные: файл CSV - Fullname, Email, Country, Device, Version, Manager Email
Выходные данные после обработки файла:
Map<Integer, Map<String,String>> reportData, где Integer = номер по порядку / ключ. Map<String, String> - Заголовок=Значение.
Всё помещается в returnedMap, чтобы вернуть из Apex reportData и дополнительно текстовую строку stringRow:
Map<String, Map<Integer, Map<String,String>>> returnedMap = new Map<String, Map<Integer, Map<String,String>>>();
returnedMap.put(stringRow, reportData);
return JSON.serialize(returnedMap);
Обрабатываем в JS полученную строку:
.then(result => {var mapFromApex = JSON.parse(result);
var mapsMap;for (var key in mapFromApex) {
this.progressStatus = key;
mapsMap = mapFromApex[key];
}for (var integerIndex in mapsMap) {
console.log('iterate map # ', integerIndex, ' = ', mapsMap[integerIndex]);
var tempMap = [];
for (var header in mapsMap[integerIndex]) {
console.log('Header = ', header, '. Value = ', mapsMap[integerIndex][header]);
tempMap.push({
key: header,
value: mapsMap[integerIndex][header]
})
}
console.log(' got temp map = ', tempMap);this.mapData.push({
key: integerIndex,
value: tempMap,
});
console.log(' got new map = ', this.mapData);this.isUploaded = true;
}
})
HTML:
<table class="slds-table slds-table_bordered slds-table_cell-buffer slds-table_col-bordered slds-table_striped">
<template for:each={mapData} for:item="row">
<tr key={row.key}>
<template for:each={row.value} for:item="headline">
<td key={headline.key}>{headline.value}</td>
</template>
</tr>
</template>
</table>
А еще вопрос. Есть ли способ вывести карты в HTML без создания доп. карты с key/value?
[quote="Dmitry Shnyrev"]console.log('mapItem ='[color=red],[/color] mapItem); Не надо складывать! Все что надо вывести, через запятую. или просто console.log(mapItem);[/quote] Спасибо, чудеса! Вот так денек! Входные данные: файл CSV - Fullname, Email, Country, Device, Version, Manager Email Выходные данные после обработки файла: Map<Integer, Map<String,String>> [b][color=red]reportData[/color][/b], где Integer = номер по порядку / ключ. Map<String, String> - Заголовок=Значение. Всё помещается в returnedMap, чтобы вернуть из Apex [color=red]reportData[/color] и дополнительно текстовую строку [color=green]stringRow[/color]: [code] Map<String, Map<Integer, Map<String,String>>> [color=purple]returnedMap[/color] = new Map<String, Map<Integer, Map<String,String>>>(); returnedMap.put([color=green]stringRow[/color], [color=red]reportData[/color]); return JSON.serialize([color=purple]returnedMap[/color]); [/code] Обрабатываем в JS полученную строку: [code] .then(result => { var mapFromApex = JSON.parse(result); var mapsMap; for (var key in mapFromApex) { [color=green]this.progressStatus = key[/color]; [color=red]mapsMap = mapFromApex[key];[/color] } for (var integerIndex in mapsMap) { console.log('iterate map # ', integerIndex, ' = ', mapsMap[integerIndex]); var tempMap = []; for (var header in mapsMap[integerIndex]) { console.log('Header = ', header, '. Value = ', mapsMap[integerIndex][header]); tempMap.push({ key: header, value: mapsMap[integerIndex][header] }) } console.log(' got temp map = ', tempMap); this.mapData.push({ key: integerIndex, value: tempMap, }); console.log(' got new map = ', this.mapData); this.isUploaded = true; } }) [/code] HTML: [code] <table class="slds-table slds-table_bordered slds-table_cell-buffer slds-table_col-bordered slds-table_striped"> <template for:each={mapData} for:item="row"> <tr key={row.key}> <template for:each={row.value} for:item="headline"> <td key={headline.key}>{headline.value}</td> </template> </tr> </template> </table> [/code] А еще вопрос. Есть ли способ вывести карты в HTML без создания доп. карты с key/value?
Что-то с обработкой ты сильно намудрил.
Можешь простыми словами описать что у тебя в .then находится?
Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных.
Сейчас код реально как полный бред выглядит.
Я думаю если начнешь описывать каждую строчку понимание что написал придет само собой.
Вообще передать из Apex карту и вывести ее на в HTML это всего одна строка в .then(result => {...} и та простое присваивание.
(но лучше не переводить это слово как карта - в простонародье это "мапа" (Map) точно также как List это "лист")
Что-то с обработкой ты сильно намудрил. Можешь простыми словами описать что у тебя в .then находится? Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных. Сейчас код реально как полный бред выглядит. Я думаю если начнешь описывать каждую строчку понимание что написал придет само собой. Вообще передать из Apex карту и вывести ее на в HTML это всего одна строка в .then(result => {...} и та простое присваивание. (но лучше не переводить это слово как карта - в простонародье это "мапа" (Map) точно также как List это "лист")
Вообще если рассуждать правильным язуком, то CSV это массив(List) состоящий из линий(Rows). А линии это объекты в котором каждое значение это атрибут. Таким образом CSV = List of objects. Как бы тут картой(мапой) и не пахнет. Конечно если рассуждать дальше то отдельный объект с атрибутами это та же мапа с ключем и значением, но такое понимание больше собьет начинающего с понимания :).
Вообще если рассуждать правильным язуком, то CSV это массив(List) состоящий из линий(Rows). А линии это объекты в котором каждое значение это атрибут. Таким образом CSV = List of objects. Как бы тут картой(мапой) и не пахнет. Конечно если рассуждать дальше то отдельный объект с атрибутами это та же мапа с ключем и значением, но такое понимание больше собьет начинающего с понимания :).
Что-то с обработкой ты сильно намудрил.
Можешь простыми словами описать что у тебя в .then находится?
Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных.
Сначала получил результат и поместил его в mapFromApex.
Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).
Потом чтобы вывести на страницу, используя LWC атрибуты for:each/ for:item мне нужны значения key/value.
Если можно вывести по-другому - скажите пожалуйста как. Но это вроде как единственный способ в LWC:
https://newstechnologystuff.com/2019/04/07/iterate-map-in-lightning-web-components-lwc/
[quote="Dmitry Shnyrev"]Что-то с обработкой ты сильно намудрил. Можешь простыми словами описать что у тебя в .then находится? Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных. [/quote] Сначала получил результат и поместил его в mapFromApex. Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex. А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>). Потом чтобы вывести на страницу, используя LWC атрибуты for:each/ for:item мне нужны значения key/value. Если можно вывести по-другому - скажите пожалуйста как. Но это вроде как единственный способ в LWC: https://newstechnologystuff.com/2019/04/07/iterate-map-in-lightning-web-components-lwc/
Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).
Ты понимаешь что вот в этом проблема?
У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?
[quote="Ivan Sokolov"]Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex. А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).[/quote] Ты понимаешь что вот в этом проблема? У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?
Возьми в коде JS. После каждой строки кода добавь console.log и выведи переменные которые ты в этой строке использовал. И посмотри что будет в консоли творится. Что в каждой переменной на каждом шаге у тебя получится.
Если можно вывести по-другому - скажите пожалуйста как.
Я не могу сказать "как" сделать. Я могу только сказать правильно или нет!
Возьми в коде JS. После каждой строки кода добавь console.log и выведи переменные которые ты в этой строке использовал. И посмотри что будет в консоли творится. Что в каждой переменной на каждом шаге у тебя получится. [quote="Ivan Sokolov"]Если можно вывести по-другому - скажите пожалуйста как. [/quote] Я не могу сказать "как" сделать. Я могу только сказать правильно или нет!
Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).
Ты понимаешь что вот в этом проблема?
У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?
Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>
Тут будет 1 кружка всего и 1 цикл.
Просто вытащил 2 разных объекта из апекса одним return.
[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex. А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).[/quote] Ты понимаешь что вот в этом проблема? У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?[/quote] Там всего получится ключ и значение. Ключ - текстовая Значение - мапа<номер строки CSV, мапа<заголовок=значение>> Тут будет 1 кружка всего и 1 цикл. Просто вытащил 2 разных объекта из апекса одним return.
Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>
А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for?
Почему не сделать <номер строки CSV, мапа<заголовок=значение>>
просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...
[quote="Ivan Sokolov"]Там всего получится ключ и значение. Ключ - текстовая Значение - мапа<номер строки CSV, мапа<заголовок=значение>>[/quote] А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for? Почему не сделать <номер строки CSV, мапа<заголовок=значение>> просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...
Так для сведения на будущее.
Map это не сортированная структура. и если ты туда положишь что-то с ключами 0,1,2,3 ...
и потом сделаешь for in Map, то не факт что у тебя ключи будут в том же порядке. Можешь получить 3,1,0,2.
Потом ключи придется еще сортировать.
Конечно в большенстве случаев в результате ты увидишь ключи в правильном порядке, но считай что тебе просто повезло!
Так для сведения на будущее. Map это не сортированная структура. и если ты туда положишь что-то с ключами 0,1,2,3 ... и потом сделаешь for in Map, то не факт что у тебя ключи будут в том же порядке. Можешь получить 3,1,0,2. Потом ключи придется еще сортировать. Конечно в большенстве случаев в результате ты увидишь ключи в правильном порядке, но считай что тебе просто повезло!
Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>
А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for?
Почему не сделать <номер строки CSV, мапа<заголовок=значение>>
просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...
Хороший вопрос. Подумаю, почему я так сделал..
[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]Там всего получится ключ и значение. Ключ - текстовая Значение - мапа<номер строки CSV, мапа<заголовок=значение>>[/quote] А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for? Почему не сделать <номер строки CSV, мапа<заголовок=значение>> просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...[/quote] Хороший вопрос. Подумаю, почему я так сделал..