Объект array в JavaScript (Lodash, функция Azure, приложение Azure Logic)

#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. Входные данные должны быть в виде массива.

Из документации Microsoft:

введите описание изображения здесь

Однако, несмотря на большую борьбу, мне не удается превратить объект в массив.

Поскольку я знаком с основами языка обработки 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 не имеет к этому никакого отношения. Извините за это.