将对象键的值合并为带分隔符的单个字符串

11

我想要实现这个目标:

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

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

console.log(obsKeysToString(obj, keys, '-'))

结果:测试 - Lorem ipsum dolores

我有一些解决方案,使用 for 循环和一些字符串操作等,但我相信有更好的方法...


3
那将会连接所有的键,我认为 OP 只想连接数组中指定的键。 - danwellman
@danwellman 正确 - Primoz Rome
@Daniel_L - 长度并不决定它是答案还是评论。即使只有一个字符,如果它是对问题的回答,则应该将其发布为问题的答案。 - BryanGrezeszak
你应该在问题中发布你想出的解决方案。这有助于澄清你的问题。 - user2033671
5个回答

17

另一个展示连接 keysvalues 或者 both 的一行代码的答案:


连接键: Object.keys(obj)

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


连接值:Object.values(obj)

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


合并两个: Object.entries(obj)

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

注意:在2017年6月,Object.entries(obj)被ECMA宣布为标准(请参见链接)。浏览器支持:除IE桌面版和移动版Safari外,其他浏览器均支持。

enter image description here

更新: Object.entries(obj) 现在在移动版 Safari 中也支持。

参考: developer.mozilla.org

enter image description here


12
您可以使用 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, '-'))


几乎完美,但与上面的答案一样有一个小故障。如果您在对象中添加一个不存在的键,例如['name','description','unexisting'],则最终会得到Test-Lorem ipsum dolores-不必要的分隔符在末尾。 - Primoz Rome
@PrimozRome 过滤器可以使用。 - Pranav C Balan
如果您事先不知道键是什么呢? - JDPeckham

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
几乎完美,除非你添加一个对象中不存在的键,例如['name','description','unexisting'],你最终会得到Test - Lorem ipsum dolores - ...不必要的分隔符在结尾。 - Primoz Rome
@PrimozRome 是的,我想假设程序知道正在查询哪些密钥。我编辑了问题以避免您提出的情况。 - Diego ZoracKy

1

只需一行代码的另一种解决方案...

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

console.log(Object.keys(obj).toString());


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 (' - ')
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接