dataset attributes - get/set correct camel case name
Asked Answered
G

2

10

I have attribute names stored somewhere in a string and need a way to create corrected names to use with dataset api. I get the names of those in attribute style, like data-attrib-name. So I need to convert them to camel case and remove the data- in front of it.

The shortest way I found out for now is my replace below. But this feel kinda hacky to me. Is there a better solution / shorter way for my task?

console.log(
  "data-my-test-name"
    .replace('data-', '')
    .replace(/-([a-z]?)/g, (m, g) => g.toUpperCase())
);
Gothurd answered 26/6, 2018 at 13:49 Comment(4)
element.dataset.myTestName = "test" Seen as this is built into the datasetproperty, why do you need to do this?.Marybelle
Are you getting the property names and try to set them or are they already set and you are trying to get the value?Milieu
I have the name as a string and try to set them to elements. @LucaGothurd
element.setAttribute("data-my-test-name", "thevalue") console.log(element.dataset.myTestName) === thevalue..Marybelle
Y
10

You can use setAttribute with the attribute directly without using the dataset

var attr = "data-attrib-name";
document.getElementById("f1").setAttribute(attr, "changed"); 

Various methods:

console.log(document.getElementById("f1").dataset);
var attr = "data-attrib-name";

document.getElementById("f1").setAttribute(attr, "changed"); // set the attribute

console.log(document.getElementById("f1").dataset);

var datasetByAttr = document.querySelector("[" + attr + "]").dataset;
console.log(datasetByAttr);
<input type="text" id="f1" data-set-name="set" data-attrib-name="attr" />

If you MUST use camelCase, you can use the dataset on an element you create;

var attr = "data-attrib-name",
    test = document.createElement("span");

test.setAttribute(attr, 1)
var camelCase = Object.keys(test.dataset)[0];
test = null;
console.log(camelCase);
Yorick answered 26/6, 2018 at 13:54 Comment(3)
@Gothurd just use setAttribute then.Marybelle
ps.. I'm fine with yours been accepted, at the end of the day it's not a race.. :) Just happy to help,...Marybelle
Thanks to you both! ;)Gothurd
M
2

Here is an example, of setting and getting, via attribute & dataset.

const sets = [
  {name: "data-my-test", value: "value 1"},
  {name: "data-another-test", value: "value 2"}
];


const d = document.querySelector("div");

sets.forEach(i => d.setAttribute(i.name, i.value));

console.log(d.dataset);
<div>
  look at my data attributes, via inpector.
</div>
Marybelle answered 26/6, 2018 at 14:6 Comment(1)
Thanks a lot, this was a great hint!Gothurd

© 2022 - 2024 — McMap. All rights reserved.