---
title: 'Evaluasi Selektif'
description: "Evaluasi selektif memungkinkan Anda untuk mengevaluasi ulang hanya field tertentu dalam schema Anda. Ini secara drastis meningkatkan performa untuk pembaruan parsial, form interaktif, dan validasi real-time dengan melewati bagian logika schema yang tidak berubah."
navigation:
  icon: 'i-ph-book-open'
seo:
  title: 'Evaluasi Selektif'
  description: "Evaluasi selektif memungkinkan Anda untuk mengevaluasi ulang hanya field tertentu dalam schema Anda. Ini secara drastis meningkatkan performa untuk pembaruan parsial, form interaktif, dan validasi real-time dengan melewati bagian logika schema yang tidak berubah."
---

## Konsep

Saat Anda memperbarui data dalam form atau konfigurasi yang besar, biasanya hanya beberapa field yang berubah. Melakukan evaluasi ulang secara penuh seringkali merupakan pemborosan yang tidak perlu.

**Evaluasi Selektif (Selective Evaluation)** mengatasi hal ini dengan cara:
1.  Menerima daftar path field yang berubah.
2.  Mengidentifikasi field mana saja yang bergantung pada perubahan tersebut.
3.  Mengevaluasi ulang **hanya** field yang diperlukan.
4.  Menyimpan hasil cache untuk field lainnya.

::code-group
  ```rust [Rust]
  use json_eval_rs::JSONEval;

  // Evaluasi penuh awal
  let mut eval = JSONEval::new(schema, None, Some(data))?;
  eval.evaluate(data, None, None)?;

  // ... data berubah ...

  // Evaluasi ulang selektif
  let paths = vec![
      "user.email".to_string(),
      "preferences.theme".to_string()
  ];
  eval.evaluate(new_data, None, Some(&paths))?;
  ```
  ```csharp [C#]
  using JsonEvalRs;

  // Evaluasi awal
  var eval = new JSONEval(schema);
  eval.Evaluate(data);

  // ... data berubah ...

  // Evaluasi ulang selektif
  var paths = new[] { "user.email", "preferences.theme" };
  eval.Evaluate(newData, paths: paths);
  ```
  ```typescript [React Native]
  import { JSONEval } from "@json-eval-rs/react-native";

  const eval = new JSONEval({ schema });
  await eval.evaluateJS({ data });

  // ... data berubah ...

  // Evaluasi ulang selektif
  await eval.evaluateJS({
    data: newData,
    paths: ["user.email", "preferences.theme"]
  });
  ```
  ```typescript [Web / NodeJS]
  import { JSONEval } from "@json-eval-rs/node"; // atau /bundler, /vanilla

  const eval = new JSONEval({ schema });
  await eval.evaluateJS({ data });

  // ... data berubah ...

  // Evaluasi ulang selektif
  await eval.evaluateJS({
    data: newData,
    paths: ["user.email", "preferences.theme"]
  });
  ```
::

## Cara Kerjanya

1.  **Dependency Graph**: Selama parsing schema, `json-eval-rs` membangun graf berarah untuk ketergantungan field. Library ini tahu bahwa `fieldC` bergantung pada `fieldB`, yang bergantung pada `fieldA`.
2.  **Resolusi Path**: Saat Anda mengirimkan `paths: ["fieldA"]`, engine menelusuri graf untuk menemukan semua "dependen" (misalnya, `fieldB`, `fieldC`).
3.  **Pembersihan Cache Selektif**: Entri cache untuk field-field spesifik ini akan di-invalidasi. Semua nilai cache lainnya (validasi, properti komputasi) tetap utuh.
4.  **Eksekusi Tertarget**: Engine evaluasi menjalankan logika hanya untuk field yang telah di-invalidasi.

## Evaluasi Selektif Subform

Subform (form item array yang terisolasi) juga mendukung evaluasi selektif. Ini sangat penting untuk performa saat mengedit satu field di dalam item daftar yang kompleks.

::code-group
  ```rust [Rust]
  // Evaluasi ulang hanya logika field 'quantity' dalam konteks item baris tertentu
  let subform_path = "#/line_items";
  let item_data = r#"{ "quantity": 5, "price": 100 }"#; // Data terbaru untuk item
  let changed_paths = vec!["quantity".to_string()];

  eval.evaluate_subform(
      subform_path,
      item_data,
      None,
      Some(&changed_paths)
  )?;
  ```
  ```csharp [C#]
  var subformPath = "#/line_items";
  var itemData = "{\"quantity\": 5, \"price\": 100}";
  var paths = new[] { "quantity" };

  eval.EvaluateSubform(
      subformPath,
      itemData,
      paths: paths
  );
  ```
  ```typescript [React Native]
  const subformPath = "#/line_items";
  const itemData = JSON.stringify({ quantity: 5, price: 100 });
  const paths = ["quantity"];

  await eval.evaluateSubform({
      subformPath,
      data: itemData,
      paths
  });
  ```
  ```typescript [Web / NodeJS]
  const subformPath = "#/line_items";
  const itemData = JSON.stringify({ quantity: 5, price: 100 });
  const paths = ["quantity"];

  await eval.evaluateSubform({
      subformPath,
      data: itemData,
      paths
  });
  ```
::

## Praktik Terbaik

-   **Gunakan Notasi Titik**: Kirimkan path seperti `"user.name"` atau `"items.0.value"`. Engine akan menormalisasinya secara otomatis.
-   **Granularitas**: Jadilah presisi. Jika hanya `user.firstName` yang berubah, jangan kirimkan `user`. Mengirimkan objek induk akan memicu evaluasi ulang semua field anaknya.
-   **Input Interaktif**: Untuk fitur "type-as-you-validate", selalu gunakan evaluasi selektif yang ditargetkan pada field input yang aktif.
