簡體   English   中英

如何轉換此對象數組以使用reduce javascript

[英]How to convert this array of objects to use reduce javascript

我正在嘗試將此函數轉換為使用reduce。 我中途了。 當選定的值為true我想知道該元素的索引。

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
];
const obj = options
              .map((option, index) => (option.selected ? index : -1))
              .filter((val) => val !== -1)[0];

結果: 1

我的嘗試是這樣的:

const obj = options.reduce((acc, currentValue, index) => {
    const i = currentValue["selected"] ? index : -1;
    return acc.concat(i)
}, []); // [-1,1,-1,-1,-1]

我如何改變整個東西使用減少?

僅當option.selected為true時,才將索引添加到結果中,否則不執行任何操作。

 let options = [ {label: 'foo1', selected: false}, {label: 'foo2', selected: true}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, ]; const selected = options.reduce((arr, option, index) => { return option.selected ? arr.concat(index) : arr; }, []); console.log(selected); 

concat()使用三元數來設置要插入的值。 Array#concat()返回更新后的數組,因此是reduce()的返回值。

還是使用傳播返回新數組[...accumulator, selsected ? i :-1] [...accumulator, selsected ? i :-1]

 const res = options.reduce((a, {selected:s}, i) => a.concat(s ? i : -1) , []); // OR // const res = options.reduce((a, {selected:s}, i) => [....a,s ? i : -1] , []); console.log(res) 
 <script> let options = [ {label: 'foo1', selected: false}, {label: 'foo2', selected: true}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, ]; </script> 

如果要使用selected = true的索引,則可以使用reduce類似的操作。 如果上下文中的當前項已selected === true,則將索引添加到累加器,否則返回累加器。 當前,如果條件為false ,則您要添加-1

 let options = [ {label: 'foo1', selected: false}, {label: 'foo2', selected: true}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, ]; const selectedIndexes = options.reduce((r, o, i) => o.selected ? r.concat(i) : r, []) console.log(selectedIndexes) 

如果需要整個對象,則可以簡單地使用filter

 let options = [{label:'foo1',selected:false},{label:'foo2',selected:true},{label:'foo2',selected:false},{label:'foo2',selected:false},{label:'foo2',selected:false},]; const filtered = options.filter(o => o.selected) console.log(filtered) 

如果selectedtrue則使用Array#reduce... spread運算符保留現有索引並添加新索引。

 let options = [ {label: 'foo1', selected: false}, {label: 'foo2', selected: true}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, {label: 'foo2', selected: true}, {label: 'foo2', selected: 1} ]; const obj = options.reduce((acc, currentValue, index) => { // checking only for boolean true not for truthy values return acc = currentValue["selected"] === true ? [...acc, index] : acc; }, []); console.log(obj); 

另一種方法是使用push而不是concat

 let options = [ {label: 'foo1', selected: false}, {label: 'foo2', selected: true}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, {label: 'foo2', selected: false}, ]; var obj = options.reduce( (acc, currentValue, index) => { currentValue.selected ? acc.push(index) : ''; return acc} ,[] ) ; console.log(obj) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM