Чтобы избежать какой-либо явной итерации, вы можете использовать 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("||");
Так вы хотите, чтобы определить 'info.join'? – Ryan
@minitech Любой метод приветствуется, как простой, так и простой в использовании. – Kuan