【问题标题】:How to add index value in filter如何在过滤器中添加索引值
【发布时间】:2020-07-27 12:38:08
【问题描述】:

假设我有一个看起来像这样的数组对象

常量选项 = [{ 标签: ”” }, { 标签:“123” }]

现在,我想过滤它并删除 label 值等于 "" 的对象,然后将与索引等效的 order 属性添加到具有标签值的数组中的那些对象

我可以结合使用 lodash 过滤器和地图,但我在想是否可以以更好的方式来做(可能只使用过滤器?)

    const options = _.filter(options, "label").map(
      (option, position) => {
        return {
          ...option,
          order: position
        }
      }
    )

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我个人认为您现在拥有的内容很好,因为它的可读性很强。一种不同的想法可能是改用_.flatMap(),它只需要对options 数组进行一次迭代。如果标签存在于对象中,则您可以返回修改后的对象。如果标签不存在,那么您可以返回一个空数组。当您为返回的每个值展平结果数组时,空数组将不会包含在结果数组中。

    const options = [{ label: "" }, { label: "123" }];
    const res = _.flatMap(options, (o, order) => o.label ? {...o, order} : []);
    console.log(res);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

    注意:你也可以使用香草版的.flatMap(),所以你不需要使用lodash,除非你需要良好的浏览器支持或者将它用于其他代码。

    【讨论】:

      【解决方案2】:

      另一种纯 JS 解决方案可能是:

      const options = [{ label: "" }, { label: "123" }];
      const modified = options.filter((el) => el.label.length).map((option, i) => ({ ...option, order: i }));
      console.log(modified);

      【讨论】:

        【解决方案3】:

        据我了解,您可以使用纯 js 过滤器:

        const options = [{
          label: ""
        }, {
          label: "123"
        }]
        var index = 0;
        const res = options.filter((e, i) => {
          e = Object.assign(e,{});
          if (e.label) {
            e.order = index++;
            return e;
          }
        })
        console.log(res)

        编辑: 您还可以使用 map 和 new 数组来调用一个函数并保持源代码纯净:

        const options = [{
          label: ""
        }, {
          label: "123"
        }]
        
        
        var newArr = [];
        options.map((e,r)=>{
            if(e.label){
                newArr.push({...e,order:newArr.length});
            }
        })
        
        console.log(options)
        console.log(newArr)

        【讨论】:

        • 这会改变原始对象,从而使您的 filter() 方法不纯,而实际上它应该是纯的。
        • @NickParsons 没问题。只需在其内部克隆e。像e = Object.assign(e,{}); 之前的if;或其他你想要的方式。
        • Object.assing(e, {})不会克隆e,它只是将一个空对象与e合并,所以你的过滤方法仍然不纯。要克隆您想以其他方式使用它:Object.assing({}, e),但如果您这样做,那么您的代码将无法工作。
        • 你是对的。它在过滤器中不起作用。所以你可以使用map 而不是filter
        • 像这样使用.map() 的问题在于,您只是将它用于循环功能。 .map() 方法应该将一个元素转换为另一个元素。因此,如果您为它提供N 元素的数组,.map() 方法将返回N 元素的数组。由于您没有使用 .map() 方法的返回值,因此您应该考虑改用 .forEach(),这对于会导致添加到外部数组等副作用的回调更好。
        猜你喜欢
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        相关资源
        最近更新 更多