簡體   English   中英

如何應用兩個數組的值?

[英]how to apply values of two arrays?

通常:如何獲取兩個數組並應用單個函數,同時對兩個數組進行迭代並更新其值?

特別:

我有一個按鈕列表和一個位置列表,它們是通過這樣的方式創建的:

let buttons:Array<Button> = makeButtons();
let positions:Array<number> = R.scan(
  (total, width) => total + width, 
  0, 
  R.map(button => button.width, buttons));

現在如何獲取職位列表,並將其應用於按鈕?

與此相關的是我另外一頭霧水-是否有一種技術來控制修改是否發生在按鈕本身上,而不是返回具有與輸入相同的“形狀”的新按鈕?

我以為在某些情況下我想做任何一種(例如,如果修改屏幕上的現有按鈕而無需重繪它們,而保持更純凈)

您正在尋找的是zipWith

zipWith((but, pos) => assoc('position', pos, but), buttons, positions)

請注意,此處使用的scan將提供比原始列表中包含的元素更多的元素:第一個元素是累加器的初始值。 但是,當最小的列表用盡時, zipWith停止。 根據您要包含第一個值還是最后一個值,您可能必須添加對tail的調用。 (我想這里的位置是按鈕的左側,並且沒有必要。)

另請注意,您將在其中重寫Ramda隨附的一些功能:

let positions = R.scan(
  (total, width) => total + width, 
  0, 
  R.map(button => button.width, buttons));

您可以得到相同的結果

let positions = R.scan(R.add, 0, R.pluck('width', buttons))

現在,如果您願意的話,也可以通過使用稍微復雜一些的累加器,進行單折操作:

R.compose(R.prop('buttons'), R.reduce((all, curr) => {
  const buttons = append(assoc('position', all.pos, curr), all.buttons);
  const pos = all.pos + curr.width;
  return {pos, buttons}
}, {pos: 0, buttons: []}))(buttons)

這將通過一次數據構建您的結構。 我實際上不會在這里推薦這個。 當我真的想避免中間結構或通過列表進行多次迭代時,這是一種技術,但這是一種有趣的選擇。

您可以在Ramda REPL中看到所有這些。


關於此:

與此相關的是我另外一頭霧水-是否有一種技術來控制修改是否發生在按鈕本身上,而不是返回具有與輸入相同的“形狀”的新按鈕?

Ramda的理念是永遠不要修改您的輸入。 因此,如果您使用R.assoc類的R.assoc ,您將始終獲得新的東西。 Ramda不會嘗試復制其繼承層次結構。 如果您想在適當位置修改按鈕,我的第一個建議是重新考慮,因為Ramda的理由很合理,但是如果您仍然願意,只需將上面的第一個建議更改為

zipWith((but, pos) => {but.position = pos; return but}, buttons, positions);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM