#javascript #arrays #json #azure-functions #lodash
#javascript #массивы #json #azure-функции #Lodash
Вопрос:
Цель состоит в том, чтобы по таймеру извлечь JSON из собственной системы управления контентом, преобразовать его в CSV и поместить этот CSV на общий диск Office 365.
Комбинация функции Azure и приложения Azure Logic делает это возможным. В своем текущем состоянии функция Node / JavaScript Azure (код ниже) (1) успешно извлекает объект JSON и (2) успешно отправляет объект в приложение Azure Logic, которое успешно его получает.
После этого приложение Logic имеет встроенное «действие» JSON-to-CSV. Входные данные должны быть в виде массива.
Однако, несмотря на большую борьбу, мне не удается превратить объект в массив.
Поскольку я знаком с основами языка обработки jq JSON, я провел много времени с пакетом node-jq npm. Я потерпел неудачу. Поэтому я обратился к Lodash. Ниже приведены JSON и код, которые являются частью моих неудачных попыток.
Оригинальный JSON:
[
{
"Challenge": {
"Group": {
"Name": "Challenge group name"
}
},
"Name": "Name",
"Description": "Description",
"CreatedDate": "2020-10-01",
"Url": "https://url",
"Category": {
"Name": "Category name"
},
"TotalVotes": 1,
"YesVotes": 2,
"NoVotes": 3,
"CurrentStatus": {
"Status": {
"Name": "Current status status name"
},
"Author": {
"DisplayName": "Current status author display name"
},
"CreatedDate": "2020-10-01"
}
},
<99 more>
]
Желаемый результат:
Некоторые ключи массива изменены из исходных ключей JSON.
[
{
"Group": "Challenge group name" (which is Challenge.Group.Name),
"Title": "Name" (which is Name),
"User": "Current status author display name" (which is CurrentStatus.Author.DisplayName),
"Category": "Category name" (which is Category.Name),
"Status": "Current status status name" (which is CurrentStatus.Status.Name),
"CreatedDate": "2020-10-01" (which is CreatedDate),
"TotalVotes": 1 (which is TotalVotes),
"YesVotes": 2 (which is YesVotes),
"NoVotes": 3 (which is NoVotes),
"URL": "https://url" (which is Url)
},
<99 more>
]
Код функции Azure
Цель печати «тестового» объекта с fs
помощью — просто показать мне вывод более удобным способом, учитывая, что журнал консоли возвращает 100 объектов, которые намного длиннее, чем упрощенный пример, приведенный выше. fs
Код не будет включен в окончательный вариант.
module.exports = function (context, myTimer) {
var timeStamp = new Date().toISOString();
var request = require("request");
var fetch = require("node-fetch");
const _ = require("lodash");
var jsonPath = "file.json";
var fs = require("fs");
var options = {
url:
"<content management system endpoint>",
headers: {
"Rest-User-Token": "<token>",
"Content-Type": "application/json",
},
};
function callback(error, response, body) {
if (!error amp;amp; response.statusCode == 200) {
var info = JSON.parse(body);
var result = info.Ideas;
<Unsuccessful object-to-array coding attempts - see a sliver of examples below>
fs.writeFile(jsonPath, JSON.stringify(result), function (err) {
if (err) {
return console.log(err);
}
});
function send() {
const azureLogicAppUrl =
"<Azure logic app endpoint>";
fetch(azureLogicAppUrl, {
method: "POST",
headers: {
Accept: "application/json, text/plain, */*",
"Content-Type": "application/json",
},
body: JSON.stringify(info),
})
//Sends JSON to Azure Logic App
.then((response) => response.text()) // or .json(), not sure
.then((json) => context.log(json));
}
send();
}
}
request(options, callback);
};
Неудачные попытки (небольшое количество)
Попытка
var flat = _.flatMap(result, 'Name');
Результат
["123","456","789","012","345",<etc>]
Попытка
const arr = (result, keyAs) => _.values(_.mapValues(result, (value, key) => { value[keyAs] = key; return value; }));
Результат
undefined
Попытка
result.blocks = _(result.blocks)
.map('Name')
.value();
Результат
result is not defined
Попытка
_.map(info, (obj, key) => {
obj.symbol = key
return obj
})
Результат
Кажется, ничего не делает
Я не профессиональный программист, пожалуйста, простите мне недостаток знаний и спасибо за любую помощь.
Ответ №1:
Если я правильно понимаю, контекст Azure в стороне, вы хотите преобразовать свой исходный JSON в желаемый (плоский) формат.
Вот базовая версия, для которой вам не нужны никакие внешние зависимости:
convert-to-flat-array.js
const sourceArray = [
{
"Challenge": {
"Group": {
"Name": "Challenge group name"
}
},
"Name": "Name",
"Description": "Description",
"CreatedDate": "2020-10-01",
"Url": "https://url",
"Category": {
"Name": "Category name"
},
"TotalVotes": 1,
"YesVotes": 2,
"NoVotes": 3,
"CurrentStatus": {
"Status": {
"Name": "Current status status name"
},
"Author": {
"DisplayName": "Current status author display name"
},
"CreatedDate": "2020-10-01"
}
},
]
const flatArray = sourceArray.map((item) => ({
Group: item.Challenge.Group.Name,
Title: item.Name,
User: item.CurrentStatus.Author.DisplayName,
Category: item.Category.Name,
Status: item.CurrentStatus.Status.Name,
CreatedDate: item.CreatedDate,
TotalVotes: item.TotalVotes,
YesVotes: item.YesVotes,
NoVotes: item.NoVotes,
URL: item.Url,
}))
console.log(flatArray)
что приводит к
~ $ node convert-to-flat-array.js
[
{
Group: 'Challenge group name',
Title: 'Name',
User: 'Current status author display name',
Category: 'Category name',
Status: 'Current status status name',
CreatedDate: '2020-10-01',
TotalVotes: 1,
YesVotes: 2,
NoVotes: 3,
URL: 'https://url'
}
]
Комментарии:
1. Это сработало — спасибо. Мой единственный вопрос заключается в том, что знаки препинания превращаются в HTML:
amp;quot;administering departmentamp;quot;
,Partneramp;#39;s
. Я знаю, что таблицы CSV здесь могут быть запутанными, и, возможно, нет способа обойти это, но я подумал, что все равно спрошу.2. Можете ли вы подтвердить, содержит ли необработанный вывод из Azure объекты HTML или это приложение для просмотра, которое преобразует кавычки?
3. Теперь, когда я проверил, он доставляется с помощью HTML из системы управления контентом в самом начале процесса. Предоставленный вами JavaScript не имеет к этому никакого отношения. Извините за это.