2017-11-11 181 views
-3

这是原始数组,过滤JSON阵列使所有MAX值在JavaScript

var dates = 
[ { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' } ] 

更新

首先,我试图排序最高week_number值阵列:

var x = dates.sort(function (itemA, itemB) { 
    return itemA.week_number < itemB.week_number; 
    }); 

得到:

[ { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' } ] 

,然后use.filter得到

[ { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' },] 

后来我发现reduce方法,但它只返回最高week_number值的对象。

var max = dates.reduce(function(prev, current) { 
    return (prev.week_number > current.week_number) ? prev : current 
    }) 

正如你所见,.filter将完成工作。

非常感谢您提供的所有答案。你是最棒的!!!

+0

比它应该表现出数组对象包含' '4'' –

+0

我的意思是,如果只有一个项目'WEEK_NUMBER:' 4''和多个'WEEK_NUMBER:“3 ''? – RomanPerekhrest

+0

如果你可以保证列表是'week_number'排序,那么你所需要做的就是在最后开始一个循环,并在'week_number'中断时包含'week_number:'max'' –

回答

1

使用map方法来获取所有的week_number。获得此数组中最大的,现在在filter方法使用该最大值得到匹配对象

var dates = [{ 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '4', 
 
    week_number: '4', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '3', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '3', 
 
    week_number: '3', 
 
    amount: '100' 
 
    } 
 
] 
 

 
var o = dates.map(function(item) { 
 
    return +item.week_number; 
 
}).sort(function(a, b) { 
 
    return a - b 
 
})[dates.length - 1] 
 
console.log(o) 
 
var m = dates.filter(function(elem) { 
 
    return elem.week_number === o.toString(); 
 
}) 
 
console.log(m)

EDIT

在上面的代码中的地图功能冗余的,排序的日期将给予最大WEEK_NUMBER的对象,那么滤波器可用于获得所需的结果

var dates = [{ 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '4', 
 
    week_number: '4', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '3', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '3', 
 
    week_number: '3', 
 
    amount: '100' 
 
    } 
 
] 
 

 
var o = dates.sort(function(a, b) { 
 
    return a.week_number - b.week_number 
 
})[dates.length - 1] 
 

 
var m = dates.filter(function(elem) { 
 
    return elem.week_number === o.week_number; 
 
}) 
 
console.log(m)

+0

是的!非常感谢:] –

+0

如果在数组中间有'{user_id:'4',week_number:'4',amount:'100'}',那么这将不起作用 – RomanPerekhrest

+0

为什么'.map()'? OP的原始'.reduce()'会更好(有些修复)。如果你可以假定最大的'week_number'在最后,'.map()'是完全多余的,因为你可以做'var o = dates [dates.length-1] .week_number' – 2017-11-11 16:49:49

1

您可以通过检查week_number来使用单循环方法,并在必要时替换结果集。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }], 
 
    result = dates.reduce(function (r, o, i) { 
 
     return !i || r[0].week_number < o.week_number 
 
      ? [o] 
 
      : r[0].week_number === o.week_number 
 
       ? r.concat(o) 
 
       : r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

如果会有'{user_id:'4',week_number:'4',amount:'100'}'作为最后一项 – RomanPerekhrest

+0

@RomanPerekhrest,那么这是行不通的,对,我认为id应该得到尊重。无论如何, –

+0

似乎OP不考虑任何其他方法 – RomanPerekhrest

0

reduce可能不是此任务的最佳工具。相反,循环式的解决方案可能是更好:

var maxWeek = 0; 
var max = []; 
dates.forEach(function(date) { 
    const week = date.week_number; 
    if (week > maxWeek) { 
     maxWeek = week; 
     max = [date]; 
    } 
    else if (week === maxWeek) { 
     max.push(date); 
    } 
}); 

注:我没有测试此代码,所以我不能保证没有错误的。

0

随着Array.sort()功能:

的第一个示例用额外的项目扩展:

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }, { user_id: '4', week_number: '4', amount: '100' }], 
 
    result = []; 
 

 
dates.sort(function(a, b){ return +b.week_number - +a.week_number; }); 
 
result.push(dates[0]); 
 
for (var i=2, len = dates.length; i<=len; i++) { 
 
    if (dates[i].week_number != result[0].week_number) break; 
 
    result.push(dates[i]); 
 
} 
 
console.log(result);

0
var res = [], prev, max; 
for (var i = 0, len = dates.length; i < len; i++) { 
    max = parseInt(dates[i].week_number); 
    if (!res.length) { 
    prev = max; res.push(dates[i]); 
    } else if (prev === max) { 
    res.push(dates[i]); 
    } else if (max > prev) { 
    prev = max; res.length = 0; res.push(dates[i]); 
    } 
} 
0

鉴于名单上week_number排序,它只是一个简单的反向循环。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 

 
var i = dates.length; 
 
var last = dates[--i]; 
 
while (--i !== -1 && dates[i].week_number === last.week_number) { 
 
} 
 

 
var res = dates.slice(i+1); 
 
console.log(res);


或者使用​​,虽然你没有得到制止环。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 

 
var res = dates.reduceRight((a, obj) => 
 
    a.length && obj.week_number !== a[a.length-1].week_number ? a : [obj, ...a] 
 
, []); 
 

 
console.log(res);


但是,如果你不能依赖列表的排序顺序,那么你应该使用.reduce()你已经写了,并在.filter()使用它的结果操作。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 
    
 
var max = dates.reduce((p, c) => +p.week_number > +c.week_number ? p : c).week_number; 
 
var res = dates.filter(d => d.week_number == max) 
 

 
console.log(res);