使用分隔符将对象键值组合为单个字符串

时间:2016-09-14 18:48:03

标签: javascript

我想实现这个目标:

*

结果:dateFormat: "MM-dd-yy", $(function() { $( "#my_date" ).datepicker({ dateFormat: "MM-dd-yy", defaultDate: "January/01/1970", minDate: "January/01/1925", maxDate: "December/31/2011", changeMonth: true, changeYear: true, yearRange: "1925:2011", onClose: function(dateText, inst) { var validDate = $.datepicker.formatDate( "MM-dd-yy",$('#my_date').datepicker('getDate')); $('#my_date').datepicker('setDate', validDate); } }); });

我有一些var keys = ['name', 'description'] var obj = { id: 1, name: 'Test', description: 'Lorem ipsum dolores', moreKeysHere: 'moreValues' } console.log(obsKeysToString(obj, keys, '-')) 循环的解决方案,以及一些搅拌操作等等,但我相信还有更好的方法..

5 个答案:

答案 0 :(得分:7)

您可以使用 Array#map 方法以及 Array#join 方法。其中 Array#filter 方法可用于过滤非空和已定义的属性值。

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, '-'))

与ES6箭头功能相同的解决方案

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, '-'))

使用 Array#reduce 方法的另一种解决方案。

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, '-'))

答案 1 :(得分:3)



 
var keys = ['name', 'description', 'nonExistentProperty']

var obj = {
  id: 1,
  name: 'Test',
  description: 'Lorem ipsum dolores',
  moreKeysHere: 'moreValues'
};

// ES6 
console.log(keys.filter(key => typeof obj[key] !== 'undefined').map(key => obj[key]).join(','));

// NON ES6 
console.log(keys.filter(function(key) { return typeof obj[key] !== 'undefined'}).map(function(key) { return obj[key]}).join(','));




答案 2 :(得分:1)

另一个答案,显示加入keysvaluesboth的1-班轮:


加入键:Object.keys(obj)

const 
  obj    = {a: '1', b: '2'},
  joined = Object.keys(obj).join(',');

合并值:Object.values(obj)

const 
  obj    = {a: '1', b: '2'},
  joined = Object.values(obj).join(',');

同时加入:Object.entries(obj)

const 
  obj    = {a: '1', b: '2'},
  joined = Object.entries(obj).join(',');

注意:Object.entries(obj)是ecma在2017年6月发布的标准(See link)。浏览器支持:除IE桌面和Mobile Safari之外的所有浏览器。

enter image description here

答案 3 :(得分:0)

使用一行代码的另一种解决方案......

var stringRep = Object.keys(obj).toString();

//stringRep = "id,name,description,moreKeysHere"

答案 4 :(得分:0)

使用Array.reduce

var keys = ['name', 'description']

var obj = {
  id: 1,
  name: 'Test',
  description: 'Lorem ipsum dolores',
  moreKeysHere: 'moreValues'
}

console.log (
  keys.reduce (
    function (strs, key) { if (obj[key]) strs.push (obj[key]);
                           return strs }, []).join (' - ')
);