[英]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)
如果selected
是true
則使用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.