【问题标题】:How to remove an item at a given index from Array/List in Elm?如何从 Elm 的 Array/List 中删除给定索引处的项目?
【发布时间】:2015-10-13 10:10:32
【问题描述】:

在给定的Array 中删除索引i 处的项目的最优雅方法是什么?在给定的List?

【问题讨论】:

    标签: arrays list elm


    【解决方案1】:

    我能想到的最好的:

    removeFromList i xs =
      (List.take i xs) ++ (List.drop (i+1) xs) 
    
    removeFromArray i =
      Array.toList >> removeFromList i >> Array.fromList 
    

    【讨论】:

    • 被打败了1分钟!你也可以去掉括号。
    • 列表的排序状态无关紧要,因为问题与列表中的位置(索引)有关,而不是与列表中元素的特征有关。它也可以是无法排序的项目列表。
    【解决方案2】:

    这应该很有效:

    remove : Int -> Array a -> Array a
    remove i a =
      let
        a1 = Array.slice 0 i a
        a2 = Array.slice (i+1) (Array.length a) a
      in
        Array.append a1 a2
    

    【讨论】:

      【解决方案3】:

      使用elm-community 中的List.Extra.removeAt

      【讨论】:

        【解决方案4】:

        我最近需要一个indexedFilter 函数。这可以为您提供基于折叠的替代方案

        indexedFilter : (Int -> a -> Bool) -> List a -> List a
        indexedFilter p xs =
            let
                tup = List.map2 (,) [ 0 .. List.length xs - 1 ] xs
            in List.foldr (\(i,x) acc -> if p i x then x :: acc else acc) [] tup
        

        【讨论】:

          【解决方案5】:

          这是基于 J 的 from 的另一种解决方案。

          用法:

          [-1,2,0] `from` ["fran","world","san","hello"]
          

          返回:[Just "hello",Just "san",Just "fran"]

          定义,在import List exposing (..)之后:

          get idx lst =  -- get an element from a list (negative indexes from end)
            if idx >= 0 then
              head (drop idx lst)
            else
              head (drop (negate (idx+1)) (reverse lst))
          
          from idxs lst =  -- atoms of idxs are indexes into lst
            case idxs of
              hd::tl -> (get hd lst)::(from tl lst)
              _ -> []
          

          【讨论】:

            【解决方案6】:

            “elm-community/array-extra”包现在提供了这个功能:

            https://package.elm-lang.org/packages/elm-community/array-extra/2.1.0/Array-Extra#removeAt

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-04-20
              • 2021-03-02
              • 1970-01-01
              • 1970-01-01
              • 2014-07-20
              • 2023-03-21
              • 2023-03-10
              相关资源
              最近更新 更多