【问题标题】:Inline javascript filter that returns sub object [duplicate]返回子对象的内联javascript过滤器[重复]
【发布时间】:2026-02-10 18:45:01
【问题描述】:

我试图在一个对象数组上调用过滤器方法,但我不想返回整个对象。我只想返回对象的一部分。

[
   {val: 0, val2: 'a'},
   {val: 1, val2: 'b'},
   {val: 2, val2: 'c'},
   {val: 3, val2: 'd'}
].filter( obj => {
    if (obj.val > 1){
        return obj.val2
}})

这个过滤函数返回

[ { val: 2, val2: 'c' }, { val: 3, val2: 'd' } ]

但应该返回

[ { val2: 'c' }, { val2: 'd' } ]

使用map 的问题是我不想将 undefined 注入到数组中

【问题讨论】:

    标签: javascript arrays ecmascript-6 filter


    【解决方案1】:

    您可以结合地图和过滤器。

    dataArray.filter(obj => obj.val > 1 && obj.val2).map(obj => obj.val2);
    

    【讨论】:

      【解决方案2】:

      由于您想在通过的迭代中构造一个新对象,您可以使用.map 在过滤后转换所有通过的对象:

      const result = [
         {val: 0, val2: 'a'},
         {val: 1, val2: 'b'},
         {val: 2, val2: 'c'},
         {val: 3, val2: 'd'}
      ]
        .filter(obj => obj.val > 1)
        .map(({ val2 }) => ({ val2 }));
      console.log(result);

      或者,只遍历数组一次:

      const input = [
         {val: 0, val2: 'a'},
         {val: 1, val2: 'b'},
         {val: 2, val2: 'c'},
         {val: 3, val2: 'd'}
      ]
      const result = [];
      for (const { val, val2 } of input) {
        if (val > 1) result.push({ val2 });
      }
      console.log(result);

      【讨论】:

        【解决方案3】:

        你也需要map()

        var res = [
           {val: 0, val2: 'a'},
           {val: 1, val2: 'b'},
           {val: 2, val2: 'c'},
           {val: 3, val2: 'd'}
        ].filter( obj => {
            if (obj.val > 1){
                return obj.val2
        }}).map(i => ({val2:i.val2}));
        console.log(res);

        【讨论】:

          【解决方案4】:

          您想为此使用 reduce,将其保持为 1 次迭代,并且只推送您想要保留的数组中的项目。

          const result = [
             {val: 0, val2: 'a'},
             {val: 1, val2: 'b'},
             {val: 2, val2: 'c'},
             {val: 3, val2: 'd'}
          ].reduce((prev, obj) => {
              if (obj.val > 1)
                  prev.push({ val2: obj.val2 });
              return prev;
          }, []);
          
          console.log(result)

          【讨论】:

          • 您能否再解释一下,所以 obj 是保存当前迭代值的项,并且 prev get 被分配给您最后以某种方式初始化的空数组?
          • 是的,没错。 Array.prototype.reduce 有 2 个参数,一个回调函数和一个初始值。对于每次迭代,回调函数的第一个参数是最后一个返回值。在第一次迭代时,previous 值将是初始值。
          【解决方案5】:

          你必须稍微改变一下你的心态,了解如何实现你的目标。

          看,只有当属性 val 的值大于 1 时,您才想获取所有 val2 属性值 - 在这种情况下,您必须将工作拆分为 2 个微任务:
          1.过滤数组,去掉所有无用的情况
          2.获取您的财产价值

          给你:

          const arr = [
            { val: 0, val2: 'a' },
            { val: 1, val2: 'b' },
            { val: 2, val2: 'c' },
            { val: 3, val2: 'd' },
          ];
          
          const res = arr.filter(({ val }) => val > 1)
                          .map(({ val2 }) => ({val2}));
          
          console.log(res)

          【讨论】: