2015-02-18 1 views
3

Все:Что это самый простой способ регистрации объекта как разделенный пробелами строки в Javascript

Я хочу построить строку из объекта JS (как построить метод ToString, но как перегрузка оператора), например:

var info = {name:"username",age:20}; 
var fmtinfo = info.join("||"); 

fmtinfo будет строка с форматом:

"name(username)||age(20)" 

Интересно, если кто-нибудь может дать мне простой способ сделать это?

Благодаря

+0

Так вы хотите, чтобы определить 'info.join'? – Ryan

+0

@minitech Любой метод приветствуется, как простой, так и простой в использовании. – Kuan

ответ

3

Чтобы избежать какой-либо явной итерации, вы можете использовать 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(). Object.keys относительно хорошо поддерживается всем, кроме IE9 (хотя полиполки не сложны).

Этот массив ключей преобразуется через Array.prototype.map() с использованием нужного форматирования строк. Это довольно просто, но не нужно, чтобы obj[k] вызывал его метод .toString() (если он доступен), чтобы преобразовать его в строку. Это позволяет отлично управлять пользовательскими объектами, так как вы можете просто определить метод toString для каждого, и он будет подхвачен виртуальной машиной. Опять же, это поддерживается IE9 и лучше, но полиполны тривиальны.

Наконец, мы присоединяем полученные строки к Array.prototype.join(), которые заботятся о том, чтобы мы не добавляли разделитель в конец или что-то в этом роде. Все браузеры поддерживают это.

Для любопытства, эквивалент ES6 будет:

let fancyString = o => Object.keys(o).map(k => "" + k + "(" + o[k] + ")").join("||"); 
+1

Спасибо за обертывание! Это самый приятный способ (ES5). – Ryan

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

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)" 
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) 

Вот jsfiddle решения: http://jsfiddle.net/pstricker/ec1oohsk/

1

Потребовалось некоторое время, но я, возможно, получил это работает, как предполагалось с помощью двух существующих StackOverflow ответов, связанных с: Object iteration и checking if JavaScript variable is function type. Я надеюсь, что это помогает :-)

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

+0

Это может быть более чистое как 'function join (object, delimiter) {...}' без 'typeof'. – Ryan

Смежные вопросы