I want to achieve this:
var keys = ['name', 'description'] var obj = { id: 1, name: 'Test', description: 'Lorem ipsum dolores', moreKeysHere: 'moreValues' } console.log(obsKeysToString(obj, keys, '-'))
Result: Test - Lorem ipsum dolores
I have some solution with for
loop, and some stirring operations and so on but I am sure there’s a better way..
Advertisement
Answer
You can use Array#map
method along with Array#join
method. Where Array#filter
method can be used for filtering non-empty and defined property values.
function obsKeysToString(o, k, sep) { // iterate over key array return k.map(function(key) { // get object property value return o[key]; // filter out non-empty and defined property }).filter(function(v) { return v; // join the property value array with the separator }).join(sep); }
var keys = ['name', 'description'] var obj = { id: 1, name: 'Test', description: 'Lorem ipsum dolores', moreKeysHere: 'moreValues' } function obsKeysToString(o, k, sep) { return k.map(function(key) { return o[key]; }).filter(function(v) { return v; }).join(sep); } console.log(obsKeysToString(obj, keys, '-'))
Same solution with ES6 arrow function
function obsKeysToString(o, k, sep) { return k.map(key => o[key]).filter(v => v).join(sep); }
var keys = ['name', 'description'] var obj = { id: 1, name: 'Test', description: 'Lorem ipsum dolores', moreKeysHere: 'moreValues' } function obsKeysToString(o, k, sep) { return k.map(key => o[key]).filter(v => v).join(sep); } console.log(obsKeysToString(obj, keys, '-'))
Another solution using Array#reduce
method.
function obsKeysToString(o, k, sep) { // iterate over key array return k.reduce(function(str, key) { // generate string based on each key return str + (o.hasOwnProperty(key) ? (str.length ? sep : '') + o[key] : ''); }, '') }
var keys = ['name', 'description'] var obj = { id: 1, name: 'Test', description: 'Lorem ipsum dolores', moreKeysHere: 'moreValues' } function obsKeysToString(o, k, sep) { return k.reduce(function(str, key) { return str + (o.hasOwnProperty(key) ? (str.length ? sep : '') + o[key] : ''); }, '') } console.log(obsKeysToString(obj, keys, '-'))