Skip to content

Instantly share code, notes, and snippets.

@KittyGiraudel
Last active August 29, 2015 13:57
Show Gist options
  • Save KittyGiraudel/9838432 to your computer and use it in GitHub Desktop.
Save KittyGiraudel/9838432 to your computer and use it in GitHub Desktop.
Generated by SassMeister.com.
// ----
// Sass (v3.4.7)
// Compass (v1.0.1)
// ----
/// Deep set function to set a value in nested maps
/// @param {Map} $map - map
/// @param {List} $keys - list of keys to reach
/// @param {Literal} $value - value to assign
/// @return {Map}
@function map-set($map, $keys, $value) {
$maps: ($map,);
$result: null;
// If the last key is a map already
// Warn the user we will be overriding it with $value
@if type-of(nth($keys, -1)) == "map" {
@warn "The last key you specified is a map; it will be overrided with `#{$value}`.";
}
// If $keys is a single key
// Just merge and return
@if length($keys) == 1 {
@return map-merge($map, ($keys: $value));
}
// Loop from the first to the second to last key from $keys
// Store the associated map to this key in the $maps list
// If the key doesn't exist, throw an error
@for $i from 1 through length($keys) - 1 {
$current-key: nth($keys, $i);
$current-map: nth($maps, -1);
$current-get: map-get($current-map, $current-key);
@if $current-get == null {
@error "Key `#{$key}` doesn't exist at current level in map.";
}
$maps: append($maps, $current-get);
}
// Loop from the last map to the first one
// Merge it with the previous one
@for $i from length($maps) through 1 {
$current-map: nth($maps, $i);
$current-key: nth($keys, $i);
$current-val: if($i == length($maps), $value, $result);
$result: map-merge($current-map, ($current-key: $current-val));
}
// Return result
@return $result;
}
$map: (
"config": (
"desktop": (
"columns": 16,
"breakpoint": 1280px,
),
"laptop": (
"columns": 12,
"breakpoint": 960px,
),
"tablet": (
"columns": 8,
"breakpoint": 640px,
),
"mobile": (
"columns": 4,
"breakpoint": 320px,
),
)
);
sass {
test: inspect(map-set($map, config desktop columns, 42));
}
sass {
test: ("config": (("desktop": (("columns": 42, "breakpoint": 1280px)), "laptop": (("columns": 12, "breakpoint": 960px)), "tablet": (("columns": 8, "breakpoint": 640px)), "mobile": (("columns": 4, "breakpoint": 320px)))));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment