【问题标题】:Concatenate multiple array of objects into one and use outside of function将多个对象数组连接成一个并在函数外使用
【发布时间】:2020-02-17 01:52:30
【问题描述】:

我想将多个数组连接成一个。我的结果是给出多个对象数组。我想将它们全部推入一个数组中。它们都是 5 个数组。我想将每个对象数组推入 1 个巨型数组。这可能吗?

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);

但这也没有用。我想在函数之外使用这个巨大的数组。

这是我的输出的样子:

我希望我的数组将所有这些数组合二为一

【问题讨论】:

  • 多重数组在哪里?我在你的代码中没有看到。 data 是一个包含多个对象的单个数组,而不是数组。
  • @Addis,我的 console.log(foo); 正在创建多个数组。
  • 你能把完整的代码过去吗?我无法重现该问题。
  • @Addis,这是整个代码。我当前的结果是[{1,3,4},{1,2,3},{1,2.''}] [{5,3,4},{1,7,3},{1,2.''}] ... 在控制台中,它首先打印第一个站点及其对象数组,然后转到下一个站点及其对象数组。我只想将它们全部连接起来,例如:[{1,3,4},{1,2,3},{1,2.''},{5,3,4},{1,7,3},{1,2.''}]
  • 考虑到您当前的解释,我已经发布了一个答案。看看这个。但是您不再需要result = [].concat(...foo);。

标签: javascript jquery arrays json javascript-objects


【解决方案1】:

sites.forEach 应该是sites.map,因为虽然它们都遍历数组中的元素,但只有Array.prototype.map 返回一个新的修改数组。仅当您想使用此修改后的数组时。你需要从myFunction 返回 foo 类似的东西

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 只是最终结果,而数组是当前元素。 reduce 方法仍然遍历所有元素。

编辑: 或者您可以使用sites.flat(取自@Addis)并将其分配给自身或新变量

// Assigns to itself
sites = sites.map(myFunction).flat()
// Assigns to a new variable
let formattedSites = sites.map(myFunction).flat()

【讨论】:

  • 嗨@BazzaCipher,我目前的结果是:[{1,3,4},{1,2,3}] [{5,3,4},{1,7,3 }]...reduce 去哪儿了?而finalarray和array又是什么?
  • 嗨@BazzaCipher,很抱歉,但它为每个站点创建了一个新数组
  • 对于每个新数组,您可以使用sites.concat(newSiteArray)
【解决方案2】:

使用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)来保存所有foos,然后应用flat()。

【讨论】:

  • 当我执行console.log(foo.flat()); 时,我得到了相同的结果。我认为我的代码的问题在于,一旦创建了第一个数组,它就会创建下一个数组并且第一个数组无效而不是添加到第一个数组。
  • 一开始我无法重现您的输出,那样会更容易。无论如何尝试console.log([...result].flat())。
  • 我添加了一张图片和更多上下文。但老实说,这是我的全部代码
  • 您使用的是什么开发环境?让我试试其他编辑器,然后再回复你。
  • 我正在使用 sublime
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2023-03-19
  • 2017-02-04
  • 2016-01-01
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多