【问题标题】:How to convert this array of objects to use reduce javascript如何将此对象数组转换为使用 reduce javascript
【发布时间】:2019-02-10 13:00:08
【问题描述】:

我正在尝试将此函数转换为使用 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]

如何更改整个东西以使用 reduce?

【问题讨论】:

  • 使用reduce是分配的家庭作业吗?因为我觉得一个简单的循环在这里很好。或者你可以使用 options.findIndex(x=>x.selected)

标签: javascript reduce


【解决方案1】:

仅当option.selected 为真时才将索引添加到结果中,否则什么也不做。

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);

【讨论】:

  • 根据我的理解,他的问题是他当前的输出,如果他使用map + filter,预期输出应该是相同的。
【解决方案2】:

在concat() 中使用三元来设置要插入的值。 Array#concat() 返回更新后的数组,这就是 reduce() 的返回。

或者使用spread返回新数组[...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>

【讨论】:

    【解决方案3】:

    如果您想要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)

    【讨论】:

      【解决方案4】:

      如果selected 是true,则使用Array#reduce 和... 扩展运算符保留现有索引并添加新索引。

      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); 

      【讨论】:

        【解决方案5】:

        另一种方法是使用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)

        【讨论】:

          猜你喜欢
          • 2017-12-24
          • 2021-12-27
          • 2018-12-26
          • 2020-08-24
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 2021-01-28
          • 2018-10-29
          相关资源
          最近更新 更多