所有
我想从JS对象构建一个字符串(比如构建一个toString方法,但是像运算符重载一样),例如:
var info = {name:"username",age:20};
var fmtinfo = info.join("||");
fmtinfo将是格式为的字符串:
"name(username)||age(20)"
我想知道是否有人能给我一个简单的方法来做到这一点?
由于
答案 0 :(得分:4)
为了避免任何显式迭代,您可以将Object.keys
与map
一起使用,将每个密钥转换为相应的条目,然后将它们join
放在一起:
function fancyString(obj) {
return Object.keys(obj).map(function (k) {
return "" + k + "(" + obj[k] + ")";
}).join("||");
}
var foo = {name: "username", age: 20};
console.log(fancyString(foo));
提供一些有关如何工作的解释:
对Object.keys()
的调用返回对象自己的可枚举键的数组,有效地组合for (f in o)
和o.hasOwnProperty()
项检查。除了IE9之外的所有东西都支持Object.keys
{相对良好'(尽管polyfills并不复杂)。
使用所需的字符串格式,通过Array.prototype.map()
转换该键数组。这很简单,但obj[k]
不会调用其.toString()
方法(如果可用)将其转换为字符串。这样可以很好地处理自定义对象,因为您只需在每个对象上定义一个toString
方法,它就会被VM选中。同样,这得到IE9的支持和更好,但polyfills是微不足道的。
最后,我们使用Array.prototype.join()
加入生成的字符串,这样可以确保我们不会将分隔符附加到结尾或类似的内容。所有浏览器都支持此功能。
为了好奇,ES6的等价物是:
let fancyString = o => Object.keys(o).map(k => "" + k + "(" + o[k] + ")").join("||");
答案 1 :(得分:3)
您可以使用for..in
语句和帮助程序数组:
var info = {name:"username",age:20};
var helperArray = [];
for( var key in info ) {
if( info.hasOwnProperty( key ) ) {
helperArray.push( key + '(' + info[key] + ')' );
}
}
alert(helperArray.join('||'));
答案 2 :(得分:2)
您可以迭代对象的键以获取键名及其对应的值。不是非常优雅,但由于所需的字符串格式不常见,因此需要一些工作。
var info = {name:"username",age:20};
var keys = Object.keys(info);
var returnVal = ""
for(var i = 0; i < keys.length; i++) {
if(returnVal.length > 0)
returnVal += "||";
returnVal += keys[i] + "(" + info[keys[i]] + ")";
}
alert(returnVal)
这是解决方案的一个方面:http://jsfiddle.net/pstricker/ec1oohsk/
答案 3 :(得分:1)
花了一段时间,但我可能已经通过两个与Object iteration和checking if JavaScript variable is function type相关的现有Stackoverflow答案按预期工作了。我希望这会有所帮助: - )
Object.prototype.join = function join(param) {
var helperArray = []
for (var key in this) {
//check that function is not printed -> join: function
if (typeof (this[key]) != "function")
helperArray.push(key + "(" + this[key] + ")")
}
return helperArray.join(param);
}
var info = {
name: "username",
age: 20
};
console.log(info.join('||'));
console.log(info.join('<>'));
console.log(info.join('%'));
答案 4 :(得分:0)
Object.prototype.fancyString = function(){
var a = []
for(var prop in this) {
if(this.hasOwnProperty(prop)) {
a.push(prop + '(' + this[prop] + ')' );
}
}
return a.join('||');
}
然后你可以这样做:
var info = {name:"username",age:20};
info.fancyString();
// outputs: "name(username)||age(20)"