diff --git a/docs/a8b7ef4627eb555f3abd.module.wasm b/docs/a8b7ef4627eb555f3abd.module.wasm new file mode 100644 index 0000000..4e496aa Binary files /dev/null and b/docs/a8b7ef4627eb555f3abd.module.wasm differ diff --git a/docs/b9cbe12a5983b2270095.module.wasm b/docs/b9cbe12a5983b2270095.module.wasm deleted file mode 100644 index 05dfdb9..0000000 Binary files a/docs/b9cbe12a5983b2270095.module.wasm and /dev/null differ diff --git a/docs/bench/a8b7ef4627eb555f3abd.module.wasm b/docs/bench/a8b7ef4627eb555f3abd.module.wasm new file mode 100644 index 0000000..4e496aa Binary files /dev/null and b/docs/bench/a8b7ef4627eb555f3abd.module.wasm differ diff --git a/docs/bench/b9cbe12a5983b2270095.module.wasm b/docs/bench/b9cbe12a5983b2270095.module.wasm deleted file mode 100644 index 05dfdb9..0000000 Binary files a/docs/bench/b9cbe12a5983b2270095.module.wasm and /dev/null differ diff --git a/docs/bench/bootstrap.js b/docs/bench/bootstrap.js index 0f3c26d..7e46a7d 100644 --- a/docs/bench/bootstrap.js +++ b/docs/bench/bootstrap.js @@ -192,7 +192,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"b9cbe12a5983b2270095"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"a8b7ef4627eb555f3abd"}[wasmModuleId] + ".module.wasm"); /******/ var promise; /******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { /******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { diff --git a/docs/bootstrap.js b/docs/bootstrap.js index b5442a3..d102046 100644 --- a/docs/bootstrap.js +++ b/docs/bootstrap.js @@ -192,7 +192,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"b9cbe12a5983b2270095"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"a8b7ef4627eb555f3abd"}[wasmModuleId] + ".module.wasm"); /******/ var promise; /******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { /******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { diff --git a/src/filter/value_wrapper.rs b/src/filter/value_wrapper.rs index d654806..4b5922a 100644 --- a/src/filter/value_wrapper.rs +++ b/src/filter/value_wrapper.rs @@ -79,15 +79,15 @@ impl ValueWrapper { match self.val.deref() { RefValue::Array(vec) => { - let mut ret = Vec::new(); + let mut set = IndexSet::new(); for v in vec { if _filter_with_object(v, key, |vv| { Self::cmp_with_term(vv, et, cmp, false, reverse) }) { - ret.push(v.clone()); + set.insert(v.clone()); } } - + let ret = set.into_iter().collect(); Some(ValueWrapper::new(RefValue::Array(ret).into(), false)) } _ => None @@ -109,12 +109,13 @@ impl ValueWrapper { _ => { match &(*self.val) { RefValue::Array(vec) => { - let mut ret = Vec::new(); + let mut set = IndexSet::new(); for v in vec { if Self::cmp_with_term(v, et, &cmp, false, reverse) { - ret.push(v.clone()); + set.insert(v.clone()); } } + let ret = set.into_iter().collect(); ValueWrapper::new(RefValue::Array(ret).into(), false) } _ => { diff --git a/tests/filter.rs b/tests/filter.rs index 284303d..267b7a3 100644 --- a/tests/filter.rs +++ b/tests/filter.rs @@ -213,6 +213,24 @@ fn op_default() { { "name" : "이름2", "age" : 42, "phone" : "++44 12341234" } ]); assert_eq!(friends, jf.into_value()); + + let ref value = json!({ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} + ]}); + let mut jf = JsonValueFilter::new_from_value(value.into()); + let mut parser = Parser::new("$..[?(@.age >= 30)]"); + parser.parse(&mut jf).unwrap(); + let friends = json!([{ "name" : "친구3", "age" : 30 }]); + assert_eq!(friends, jf.into_value()); + } #[test]