最後に、あきらめて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
};
Array.from()
は、これを行うための良い方法です。 {length: somlength}
オブジェクトまたは他の配列のようなオブジェクトと、各アイテムを定義する関数を渡すことができます。その関数への最初の引数(使用されていないことを示すために_
と呼ぶ)は、渡した配列の項目になります(ただし、長さだけを渡したのであまり意味がありません)。 i
はインデックスで、id
に使用されます:
let sampleData = Array.from({length: 10}, (_, id) => ({id}))
console.log(sampleData)
私が通常行うことはこれです:
const data = Array(10).fill().map((v, i) => ({id: i + 1}))
fill
は、map
で使用できることを確認します
spread
演算子でArray
を使用してから、各undefined
要素を目的のオブジェクトにマップできます。
var arr = [...Array(10)].map((_,i)=>({id:i}));
console.log(arr)
アナモルフィズム、またはリバースフォールドを探しています。
// 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 ]
.from()
の例は素晴らしいですが、本当にクリエイティブにしたい場合はこれをチェックしてください。
const newArray = length => [...`${Math.pow(10, length) - 1}`]
newArray(2)
newArray(10)
しかし、非常に制限されています
newArray(1000)
["I", "n", "f", "i", "n", "i", "t", "y"]
これを行うには、単純な再帰プロセスを使用できます。
const iter = (arr, counter) => {
if (counter === 25) return arr;
return iter([...arr, {id:counter}], counter + 1)
}
iter([], 0)