Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象/数组操作_Javascript_Arrays_Node.js_Object - Fatal编程技术网

Javascript 对象/数组操作

Javascript 对象/数组操作,javascript,arrays,node.js,object,Javascript,Arrays,Node.js,Object,我使用Postgres w/Knex从db查询节点获得一个对象数组,看起来像这样:缩小版 [ { tvshow: 'house', airdate: 2017-02-01T00:00:00.000Z }, { tvshow: 'big bang theory', airdate: 2017-02-01T00:00:00.000Z }, { tvshow: 'simpsons', airdate: 2017-02-

我使用Postgres w/Knex从db查询节点获得一个对象数组,看起来像这样:缩小版

[ 
   {
    tvshow: 'house',
    airdate: 2017-02-01T00:00:00.000Z 
   },
   {
    tvshow: 'big bang theory',
    airdate: 2017-02-01T00:00:00.000Z 
   },
   {
    tvshow: 'simpsons',
    airdate: 2017-02-02T00:00:00.000Z 
   },
   {
    tvshow: 'suits',
    airdate: 2017-02-02T00:00:00.000Z 
   },
   {
    tvshow: 'sun',
    airdate: 2017-02-03T00:00:00.000Z 
   },
   {
    tvshow: 'blacklist',
    airdate: 2017-02-03T00:00:00.000Z
  },
  {
    tvshow: 'something',
    airdate: 2017-02-03T00:00:00.000Z 
  },
  {
    tvshow: 'homeland',
    airdate: 2017-02-03T00:00:00.000Z 
  },
  {
    tvshow: 'american dad',
    airdate: 2017-02-04T00:00:00.000Z 
  },
  {
    tvshow: 'games',
    airdate: 2017-02-05T00:00:00.000Z 
  }
]
返回此信息的查询将airdate字段限制为5天。这意味着无论我用它做什么,它都会有5天

我的目标是让电视节目按天过滤

预期输出示例

我有一个可行的解决方案,但我认为可以改进。这是我正在做的。我用momentjs来比较日期“结果”是对象的查询结果数组的名称

const obj = {};
let array = [];
let i = 0;
let currentDate = null;

result.forEach((element) => {
  if (currentDate !== moment(element.airdate).format('DD-MM-YYYY')) {
    if (currentDate !== null) {      // skip first iteration where currentDate is null
      i++;
      obj[`day${i}`] = array;     // new day => store previous day tvshow's array in the object
    }
    array = [];     // reset temporary array
  }
  array.push(element.tvshow);    // push tvshow to temporary array
  currentDate = moment(element.airdate).format('DD-MM-YYYY');   // update current date
});
obj[`day${i+1}`] = array;    // add last/5th day array to the object

我会尽量避免修改forEach回调内部的变量,这些变量是在forEach回调外部定义的

这是一个带有reduce的版本,它将所有状态存储在reduce累加器中。最后,可以提取包含结果对象的零件。它假定日期是按升序排列的,您可以在查询中处理:

result = result.reduce( (acc, {tvshow, airdate}) => {
    acc.i += acc.airdate !== airdate;
    acc.airdate = airdate;
    acc.obj[`day${acc.i}`] = (acc.obj[`day${acc.i}`] || []).concat(tvshow);
    return acc;
}, {i:0, obj: {}} ).obj;
让结果=[ { 电视节目:"房子",, 播出日期:“2017-02-01T00:00:00.000Z” }, { 电视节目:《大爆炸理论》, 播出日期:“2017-02-01T00:00:00.000Z” }, { 电视节目:《辛普森一家》, 播出日期:“2017-02-02T00:00:00.000Z” }, { 电视节目:"西装",, 播出日期:“2017-02-02T00:00:00.000Z” }, { 电视节目:《太阳报》, 播出日期:“2017-02-03T00:00:00.000Z” }, { 电视节目:"黑名单",, 播出日期:“2017-02-03T00:00:00.000Z” }, { 电视节目:《某物》, 播出日期:“2017-02-03T00:00:00.000Z” }, { 电视节目:"祖国",, 播出日期:“2017-02-03T00:00:00.000Z” }, { 电视节目:《美国爸爸》, 播出日期:“2017-02-04T00:00:00.000Z” }, { 电视节目:"游戏",, 播出日期:“2017-02-05T00:00:00.000Z” } ]; result=result.reduce acc,{tvshow,airdate}=>{ acc.i+=acc.airdate!==airdate; acc.airdate=airdate; acc.obj[`day${acc.i}`]=acc.obj[`day${acc.i}`]| |[].concattvshow; 返回acc; },{i:0,obj:{}}.obj;
console.logresult;你没有问任何问题。我有一个可行的解决方案,但我认为可以改进。堆栈溢出主要是针对有关无法工作的代码的问题。也许是回答你问题的好地方,但你需要更具体一些。@HunterMcMillen如果我不够清楚,很抱歉。问题是:‘这个代码可以改进吗?“怎么做?”费利克斯克林,谢谢。我不知道codereview。我要试试看!我投票结束这个问题,因为它属于codereview.stackexchange.com。谢谢!看起来好多了。我得看看reduce函数。
result = result.reduce( (acc, {tvshow, airdate}) => {
    acc.i += acc.airdate !== airdate;
    acc.airdate = airdate;
    acc.obj[`day${acc.i}`] = (acc.obj[`day${acc.i}`] || []).concat(tvshow);
    return acc;
}, {i:0, obj: {}} ).obj;