diff --git a/boa/src/builtins/json/mod.rs b/boa/src/builtins/json/mod.rs index b657c808407..2819bd53a9f 100644 --- a/boa/src/builtins/json/mod.rs +++ b/boa/src/builtins/json/mod.rs @@ -86,22 +86,20 @@ pub fn stringify(_: &mut Value, args: &[Value], interpreter: &mut Interpreter) - .as_object() .map(|obj| { let object_to_return = Value::new_object(None); - for (key, val) in obj.properties.iter() { - if let Some(value) = &val.value { - let mut this_arg = object.clone(); - object_to_return.set_property( - String::from(key), - Property::default().value( - interpreter - .call( - replacer, - &mut this_arg, - &[Value::string(key), Value::from(value)], - ) - .expect("failed to get returned value from replacer function"), - ), - ); - } + for (key, val) in obj.properties.iter().filter(|(_, v)|v.value.is_some()) { + let mut this_arg = object.clone(); + object_to_return.set_property( + key.to_owned(), + Property::default().value( + interpreter + .call( + replacer, + &mut this_arg, + &[Value::string(key), Value::from(val.value.as_ref())], + ) + .expect("failed to get returned value from replacer function"), + ), + ); } Value::from(object_to_return.to_json().to_string()) }) @@ -111,18 +109,17 @@ pub fn stringify(_: &mut Value, args: &[Value], interpreter: &mut Interpreter) - serde_json::Map::with_capacity(replacer_as_object.properties.len() - 1); let fields = replacer_as_object .properties - .iter() - .filter_map(|(key, prop)| { + .keys() + .filter_map(|key| { if key == "length" { None } else { - // TODO: this should be the abstract operation `Get` - prop.value.as_ref().map(Value::to_string) + Some(replacer.get_field_slice(&key.to_string())) } }); for field in fields { if let Some(value) = object - .get_property(&field) + .get_property(&field.to_string()) .map(|prop| prop.value.as_ref().map(|v| v.to_json())) .flatten() { diff --git a/boa/src/builtins/value/mod.rs b/boa/src/builtins/value/mod.rs index e474f05692d..3c5109cad1e 100644 --- a/boa/src/builtins/value/mod.rs +++ b/boa/src/builtins/value/mod.rs @@ -728,7 +728,7 @@ impl ValueData { Self::Object(ref obj) => { if obj.borrow().kind == ObjectKind::Array { let mut arr: Vec = Vec::new(); - obj.borrow().properties.iter().for_each(|(k, _)| { + obj.borrow().properties.keys().for_each(|k| { if k != "length" { let value = self.get_field_slice(k); if value.is_undefined() || value.is_function() { @@ -741,7 +741,7 @@ impl ValueData { JSONValue::Array(arr) } else { let mut new_obj = Map::new(); - obj.borrow().properties.iter().for_each(|(k, _)| { + obj.borrow().properties.keys().for_each(|k| { let key = k.clone(); let value = self.get_field_slice(k); if !value.is_undefined() && !value.is_function() {