2017-11-11 195 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);