Объединить несколько массивов объектов в один и использовать вне функции - PullRequest
1 голос
/ 21 октября 2019

Я хочу объединить несколько массивов в один. Мой результат здесь дает несколько массивов объектов. Я хочу поместить все их в один массив. Все они имеют массив из 5. Я хочу поместить каждый массив объектов в один гигантский массив. Это возможно?

let data = [{"site_nm": "gs Universe", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Gameplay", "date": "2019-10-01", "sigh": 4, "yo": 3, "wokay": 2}, {"site_nm": "gs Universe Trailers", "date": "2019-10-01", "sigh": 5, "yo": 5, "wokay": 0}, {"site_nm": "TR", "date": "2019-10-01", "sigh": 4, "yo": 4, "wokay": 0}, {"site_nm": "gs", "date": "2019-10-01", "sigh": 5, "yo": 5, "wokay": 2}, {"site_nm": "GB", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 1}, {"site_nm": "cn", "date": "2019-10-01", "sigh": 4, "yo": 4, "wokay": 1}, {"site_nm": "Roadshow", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "TV", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "ZD", "date": "2019-10-01", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "Carfection", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Trailers", "date": "2019-10-01", "sigh": 3, "yo": 3, "wokay": 0}, {"site_nm": "gs News", "date": "2019-10-01", "sigh": 3, "yo": 3, "wokay": 0}, {"site_nm": "gs Mobile", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Universe Trailers", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Gameplay", "date": "2019-10-04", "sigh": 6, "yo": 6, "wokay": 2}, {"site_nm": "Roadshow", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "gs", "date": "2019-10-02", "sigh": 3, "yo": 3, "wokay": 2}, {"site_nm": "TR", "date": "2019-10-02", "sigh": 4, "yo": 3, "wokay": 0}, {"site_nm": "cn Highlights", "date": "2019-10-03", "sigh": 8, "yo": 8, "wokay": 0}, {"site_nm": "gs Universe", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "cn en Espa\u00f1ol", "date": "2019-10-02", "sigh": 6, "yo": 6, "wokay": 0}, {"site_nm": "gs Trailers", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "ZD", "date": "2019-10-02", "sigh": 4, "yo": 4, "wokay": 1}, {"site_nm": "cn", "date": "2019-10-05", "sigh": 5, "yo": 5, "wokay": 1}, {"site_nm": "TV", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "CH", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "GB", "date": "2019-10-02", "sigh": 3, "yo": 3, "wokay": 3}, {"site_nm": "DLNow", "date": "2019-10-02", "sigh": 1, "yo": 0, "wokay": 0}, {"site_nm": "gs News", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}]

let sites = [...new Set(data.map(({
        site_nm
      }) => site_nm))].sort();


let dates = [...new Set(data.map(({
        date
      }) => date))].sort();

sites.forEach(myFunction);

function myFunction(item) {

  var foo = data.filter(function(e) {
          return e.site_nm == item;
        });
 
  
        let foo_dates = [...new Set(foo.map(({
          date
        }) => date))].sort();
        
  for (
        var date = moment(dates[0], "YYYY-MM-DD"); date <= moment(dates[dates.length - 1], "YYYY-MM-DD"); date = date.add(1, 'days')) {
       
        var dateFormatted = date.format("YYYY-MM-DD");

          if (!foo_dates.includes(dateFormatted)) {
            foo.push({
              "site_nm": item,
              "date": dateFormatted,
              "sigh": "",
              "yo": "",
              "wokay": ""
            });
          }
      }
    console.log(foo);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Я пытался

result = [].concat(...foo);
console.log(result);

Но это тоже не сработало. Я хочу использовать этот гигантский массив вне функции.

Вот так выглядит мой вывод:

multiple arrays

Я хочу, чтобы мой массив был всеми этими массивами в одном

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

sites.forEach должно быть sites.map, поскольку, хотя они оба перебирают элементы в массиве, только Array.prototype.map возвращает новый измененный массив. Это только если вы хотите использовать этот модифицированный массив. И вам нужно будет вернуть foo из myFunction с чем-то вроде

console.log(foo);
return foo;

Затем используйте Array.prototype.reduce, чтобы сделать его огромным массивом. Добавить ниже sites.foreach (сейчас sites.map)

// makes [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
// become [1, 2, 3, 4, 5, 6, 7, 8, 9]
sites.reduce((finalarray, array) => finalarray.concat(array))

, который просто складывает все объекты вместе. finalarray - это только окончательный результат, а массив - текущий элемент. Метод уменьшает все итерации по всем элементам.

РЕДАКТИРОВАТЬ: Или вы можете использовать sites.flat (взято из @ Addis ) и назначить его себе или новую переменную

// Assigns to itself
sites = sites.map(myFunction).flat()
// Assigns to a new variable
let formattedSites = sites.map(myFunction).flat()
1 голос
/ 21 октября 2019

Используйте метод flat() для создания нового массива со всеми объединенными элементами подмассива:

console.log(result.flat())

или

console.log([...result].flat())

let data = [{"site_nm": "gs Universe", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Gameplay", "date": "2019-10-01", "sigh": 4, "yo": 3, "wokay": 2}, {"site_nm": "gs Universe Trailers", "date": "2019-10-01", "sigh": 5, "yo": 5, "wokay": 0}, {"site_nm": "TR", "date": "2019-10-01", "sigh": 4, "yo": 4, "wokay": 0}, {"site_nm": "gs", "date": "2019-10-01", "sigh": 5, "yo": 5, "wokay": 2}, {"site_nm": "GB", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 1}, {"site_nm": "cn", "date": "2019-10-01", "sigh": 4, "yo": 4, "wokay": 1}, {"site_nm": "Roadshow", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "TV", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "ZD", "date": "2019-10-01", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "Carfection", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Trailers", "date": "2019-10-01", "sigh": 3, "yo": 3, "wokay": 0}, {"site_nm": "gs News", "date": "2019-10-01", "sigh": 3, "yo": 3, "wokay": 0}, {"site_nm": "gs Mobile", "date": "2019-10-01", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Universe Trailers", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "gs Gameplay", "date": "2019-10-04", "sigh": 6, "yo": 6, "wokay": 2}, {"site_nm": "Roadshow", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "gs", "date": "2019-10-02", "sigh": 3, "yo": 3, "wokay": 2}, {"site_nm": "TR", "date": "2019-10-02", "sigh": 4, "yo": 3, "wokay": 0}, {"site_nm": "cn Highlights", "date": "2019-10-03", "sigh": 8, "yo": 8, "wokay": 0}, {"site_nm": "gs Universe", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "cn en Espa\u00f1ol", "date": "2019-10-02", "sigh": 6, "yo": 6, "wokay": 0}, {"site_nm": "gs Trailers", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}, {"site_nm": "ZD", "date": "2019-10-02", "sigh": 4, "yo": 4, "wokay": 1}, {"site_nm": "cn", "date": "2019-10-05", "sigh": 5, "yo": 5, "wokay": 1}, {"site_nm": "TV", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "CH", "date": "2019-10-02", "sigh": 1, "yo": 1, "wokay": 0}, {"site_nm": "GB", "date": "2019-10-02", "sigh": 3, "yo": 3, "wokay": 3}, {"site_nm": "DLNow", "date": "2019-10-02", "sigh": 1, "yo": 0, "wokay": 0}, {"site_nm": "gs News", "date": "2019-10-02", "sigh": 2, "yo": 2, "wokay": 0}]

let bigArray = [];

let sites = [...new Set(data.map(({
        site_nm
      }) => site_nm))].sort();


let dates = [...new Set(data.map(({
        date
      }) => date))].sort();

sites.forEach(myFunction);

function myFunction(item) {

  var foo = data.filter(function(e) {
          return e.site_nm == item;
        });


        let foo_dates = [...new Set(foo.map(({
          date
        }) => date))].sort();

  for (
        var date = moment(dates[0], "YYYY-MM-DD"); date <= moment(dates[dates.length - 1], "YYYY-MM-DD"); date = date.add(1, 'days')) {

        var dateFormatted = date.format("YYYY-MM-DD");

          if (!foo_dates.includes(dateFormatted)) {
            foo.push({
              "site_nm": item,
              "date": dateFormatted,
              "sigh": "",
              "yo": "",
              "wokay": ""
            });
          }
      }
    bigArray.push(foo);
}

console.log(bigArray.flat());

Здесь у меня естьдобавил еще один массив (bigArray) для хранения всех foo с и затем применил flat().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...