web-dev-qa-db-ja.com

JavaScript ES6で配列を初期化する機能的な方法はありますか?

最後に、あきらめてforループを作成し、各オブジェクトがオブジェクトの属性として増分カウンター(id)を持つ単純なオブジェクトの配列を初期化しました。言い換えれば、私はただ欲しい:

var sampleData = [{id: 1},{id: 2},...];

私はreturnステートメントを置くことができるコンパクトな構文を望んでいました。

let sampleData = [];
for (var p = 0; p < 25; p++){
    sampleData.Push({id: p});
}

return {
    data: sampleData,
    isLoading: true
};
27
Pete

Array.from() は、これを行うための良い方法です。 {length: somlength}オブジェクトまたは他の配列のようなオブジェクトと、各アイテムを定義する関数を渡すことができます。その関数への最初の引数(使用されていないことを示すために_と呼ぶ)は、渡した配列の項目になります(ただし、長さだけを渡したのであまり意味がありません)。 iはインデックスで、idに使用されます:

let sampleData = Array.from({length: 10}, (_, id) => ({id}))

console.log(sampleData)
44
Mark Meyer

私が通常行うことはこれです:

const data = Array(10).fill().map((v, i) => ({id: i + 1}))

fillは、mapで使用できることを確認します

14
yidaohuuu

spread演算子でArrayを使用してから、各undefined要素を目的のオブジェクトにマップできます。

var arr = [...Array(10)].map((_,i)=>({id:i}));
console.log(arr)
8
JohanP

アナモルフィズム、またはリバースフォールドを探しています。

// unfold : ((r, state) -> List r, unit -> List r, state) -> List r
const unfold = (f, init) =>
  f ( (x, next) => [ x, ...unfold (f, next) ]
    , () => [] 
    , init
    )
    
// sampleData : List { id: Int }
const sampleData =
  unfold
    ( (next, done, i) =>
        i > 25
          ? done ()
          : next ({ id: i }, i + 1)
    , 0
    )
    
console .log (sampleData)
// [ { id: 0 }, { id : 1 }, ... { id: 25 } ]

unfoldが他の一般的なプログラムで使用されているのを見ると、どのように機能するかを直感的に理解できます。

// unfold : ((r, state) -> List r, unit -> List r, state) -> List r
const unfold = (f, init) =>
  f ( (x, next) => [ x, ...unfold (f, next) ]
    , () => []
    , init
    )
    
// fibseq : Int -> List Int
const fibseq = init =>
  unfold
    ( (next, done, [ n, a, b ]) =>
         n === 0
           ? done ()
           : next (a, [ n - 1, b, a + b ])
    , [ init, 0, 1 ]
    )
    
console .log (fibseq (10))
// [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]

unfoldの実装は1つの可能性にすぎません。いじくり回して、好きな方法で実装します–

// type Maybe a = Nothing | Just a    

// Just : a -> Maybe a
const Just = x =>
  ({ match: ({ Just: f }) => f (x) })

// Nothing : unit -> Maybe a
const Nothing = () =>
  ({ match: ({ Nothing: f }) => f () })

// unfold : (state -> Maybe (a, state), state) -> List a  
const unfold = (f, init) =>
  f (init) .match
    ( { Nothing: () => []
      , Just: ([ x, next ]) => [ x, ...unfold (f, next) ]
      }
    )

// fibseq : Int -> List Int
const fibseq = init =>
  unfold
    ( ([ n, a, b ]) =>
        n === 0
          ? Nothing ()
          : Just ([ a, [ n - 1, b, a + b ] ]) // <-- yikes, read more below
    , [ init, 0, 1 ]
    )
    
console .log (fibseq (10))
// [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]

[]をタプルとして使用して少し上に浮気しました。これによりプログラムは短くなりましたが、物事を明示的にモデル化し、それらのタイプを考慮する方が良いでしょう。この質問にfunctional-programmingでタグ付けしたので、この種の暗黙的な処理をプログラムから削除するために余分な時間をかける価値があります。これを別のステップとして表示することで、unfoldだけでなく、設計するすべてのプログラムに適用できるテクニックを分離します–

// type Maybe a = Nothing | Just a
// type Tuple a b = { first: a, second: b }

// Just : a -> Maybe a
const Just = x =>
  ({ match: ({ Just: f }) => f (x) })

// Nothing : unit -> Maybe a
const Nothing = () =>
  ({ match: ({ Nothing: f }) => f () })

// Tuple : (a, b) -> Tuple a b
const Tuple = (first, second) =>
  ({ first, second })

// unfold : (state -> Maybe Tuple (a, state), state) -> List a  
const unfold = (f, init) =>
  f (init) .match
    ( { Nothing: () => []
      , Just: (t) => [ t.first, ...unfold (f, t.second) ] // <-- Tuple
      }
    )

// fibseq : Int -> List Int
const fibseq = init =>
  unfold
    ( ([ n, a, b ]) =>
        n === 0
          ? Nothing ()
          : Just (Tuple (a, [ n - 1, b, a + b ])) // <-- Tuple
    , [ init, 0, 1 ]
    )
    
console .log (fibseq (10))
// [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]
6
user633183

.from()の例は素晴らしいですが、本当にクリエイティブにしたい場合はこれをチェックしてください。

const newArray = length => [...`${Math.pow(10, length) - 1}`]
newArray(2)
newArray(10)

しかし、非常に制限されています

newArray(1000)
["I", "n", "f", "i", "n", "i", "t", "y"]
4
stwilz

これを行うには、単純な再帰プロセスを使用できます。

const iter = (arr, counter) => {
  if (counter === 25) return arr;
  return iter([...arr, {id:counter}], counter + 1)
}
iter([], 0)