web-dev-qa-db-ja.com

ラムダを使用して配列のオブジェクトプロパティを変更する

以下のようなオブジェクトの配列があります:

[{name:'name', key:'21',good: 'true'},
{name: 'another name', key:'22',good:'false'},
...]

次に、この配列内のオブジェクトの1つを変更します。私の最初の試みはこれでした:

const s = R.compose(
  R.assoc('good', checked),
  R.propEq('key', name),
  R.map(),
);

しかし、このコードは、私が欲しいオブジェクトとその'good'プロパティ。その変更で配列全体を取得したいと思います。

9
amir

私はそれを次のようにします:

const alter = curry((checked, key, items) => map(
  when(propEq('key', key), assoc('good', checked)),
  items
))

alter('true', '22', items)

これには、無料の変数(元のcheckednameなど)を含めないという利点があります。これの部分的なバージョンが必要ない場合は、カリー化を削除できます。

これはRamda REPLで実際に確認できます。

16
Scott Sauyet

チェックする値と名前についていくつかの仮定をしなければなりませんでした。

let checked = 'true'
let name = '22'

let input = [{name:'name', key:'21',good: 'true'},
{name: 'another name', key:'22',good:'false'}]

const update = R.map(R.ifElse(R.propEq('key', name), R.assoc('good', checked), (item) => item))

console.log(update(input))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
3
Chris Phillips

Ramdaのfind、findIndex、updateを組み合わせて使用​​します。配列の名前が配列で、配列の2番目のオブジェクトのキーを変更するとします。そして、「22」から「40」に変更したいとします。

const objToChange = R.find(R.propEq('key', 22 ))(array); // To find the object you like to change.
objToChange.key = 40; // Change your desired field.
R.update(R.findIndex(R.propEq('key', 22))(array), objToChange, 
patients); // And update the array with the new changed object.

または単にfindIndexを使用して...

const index = R.findIndex(R.propEq('key', 22))(patients);
array[index].key = 40;
0
ikranas