Javascript 对象/数组操作
我使用Postgres w/Knex从db查询节点获得一个对象数组,看起来像这样:缩小版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-
[
{
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;