2 回答

TA貢獻1895條經(jīng)驗 獲得超3個贊
我會保存我的回復(fù),因為我們有一個很好的解釋,為什么您的方法很棒,因為您有O(N)計算復(fù)雜性(感謝對@CertainPerformance的精彩評論)并且您只迭代一次數(shù)組。
測試reduce方法是否保留對象鍵的順序:
看起來reduce方法沒有保留鍵的順序。在這里,我們看到鍵是按順序排序的,然后如何遍歷源數(shù)組myArray,但是在 Chrome 瀏覽器中,這種行為是不可重現(xiàn)的(鍵是排序的):
var myArray = [{letter: 'c'}, {letter:'e'}, {letter: 'e'}, {letter:'b'}, {letter: 'c'}, {letter:'a'}, {letter:'b'}, {letter:'a'}, {letter: 'd'}, {letter: 'd'}, {letter: 'd'}, {letter: 'd'}];
var myOrderedKeys = myArray.reduce((a, {letter}) => {
a[letter] = a[letter] || letter;
a[letter] = letter;
return a;
}, {})
console.log(myOrderedKeys);
我們有多個字母的一個例子:
let notSimpleLetters = [{letter: 'ce'}, {letter:'ec'}, {letter: 'ec'}, {letter:'bw'}, {letter: 'ce'}, {letter:'aw'}, {letter:'ba'}, {letter:'aa'},
{letter: 'df'}, {letter: 'cb'}, {letter: 'dc'}, {letter: 'da'}];
let notSimpleKeys = notSimpleLetters.reduce((a, {letter}) => {
a[letter] = a[letter] || letter;
a[letter] = letter;
return a;
}, {})
console.log(notSimpleKeys);

TA貢獻1936條經(jīng)驗 獲得超7個贊
實際上,無論是通過 usingreduce()還是任何其他Array方法,順序都將被保留,因為它們將從索引 0 執(zhí)行到array.
但reduce()主要用于將array元素累積成單個元素,這不是做這種事情的最佳方法,但也可以使用。
請注意,您使用的實際代碼reduce()沒有返回正確的輸出。
在我看來,我認為在這種情況下Array.map()方法更好,但它應(yīng)該與Array.filter()刪除重復(fù)的元素結(jié)合使用map():
var result = data.map(v => {
v.values = data.filter(e => e.group == v.group).map(x => x.value);
delete v.value;
return v;
}).filter(x => !x.values.some(e => !e));
演示:
let data = [{
group: '1',
value: 'a'
}, {
group: '1',
value: 'b'
}, {
group: '2',
value: 'c'
}, {
group: '2',
value: 'd'
}];
var result = data.map(v => {
v.values = data.filter(e => e.group == v.group).map(x => x.value);
delete v.value;
return v;
}).filter(x => !x.values.some(e => !e));
console.log(result);
添加回答
舉報