2013-10-01 4 views
-2

Мне нужно получить «ключи» как одну строку, а затем их значения как другую.Как преобразовать объектные ключи и значения в форматированную строку?

Вот моя неудавшаяся попытка написания этого цикла, это только на самом деле работает на одном уровне ...

function convertToString(objArray) { 
    var str = ''; 

    for (var i = 0; i < objArray.length; i++) { 
     var line = ''; 
     for (var index in objArray[i]) { 
      if (line != '') line += ',' 

      line += objArray[i][index]; 
     } 

     str += line + '\r\n'; 
    } 

    return str; 
} 

Вот пример объекта, реальный гораздо больше, но это должно сделать для примера:

var obj = { 
    "a": "a", 
     "b": [{ 
     "c": "c", 
      "d": "d" 
    }, { 
     "e": "e", 
      "f": "f" 
    }], 
    "g": true, 
    "h": { 
     "i": "i", 
     "j": "j", 
     "k": 1 
    }, 
    "l": "l" 
}; 

Мой желаемый результат для ключей будет:

"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" 

И их соответствующие значения строка будет выглядеть так:

"a", object, "c", "d", "e", "f", true, object, "i", "j", 1, "l" 

Если кто-то может направить меня в правильном направлении, что было бы здорово, я не ожидал, что кто писать код меня, но что-то, чтобы начать меня, было бы здорово.

Целью этого является преобразование объекта ответа в формат, который я могу использовать для загрузки CSV-файла с теми же данными.

+0

Итак, вы хотите разрушить структуру? –

+0

@EvanKnowles в некотором смысле да! –

+0

Какой смысл делать это? – undefined

ответ

4

Вы можете использовать рекурсивный for..in в javascript, например:

http://jsbin.com/udEBAxe/2/edit

var obj = { 
    "a": "a", 
     "b": [{ 
     "c": "c", 
      "d": "d" 
    }, { 
     "e": "e", 
      "f": "f" 
    }], 
    "g": true, 
    "h": { 
     "i": "i", 
     "j": "j", 
     "k": 1 
    }, 
    "l": "l" 
}; 

function inspect(o, props){ 
    var kk = []; 
    for(var p in o) { 
    if(o.hasOwnProperty(p)) {  
     if(typeof o[p] == 'object') 
     kk = kk.concat(inspect(o[p], props)); 
     else { 
     var m = (props) ? o[p] : p; 
     kk.push(m); 
     } 
    } 
    } 
    return kk; 
} 

var s = inspect(obj,false); 
alert(s.join(',')); 

s = inspect(obj,true); 
alert(s.join(',')); 
+0

Я отметил это правильно, вы достигли именно того, что мне нужно, в очень минимальном коде и даже отформатировали строку. Большое спасибо. –

+0

http://jsfiddle.net/shannonhochkins/vUnF9/844/ Вот твоя потрясающая работа с моим главным объектом :) –

+0

выглядит великолепно, приветливо! – jerjer

0

Хорошо, ваш результат показывает вам значение, а не ключи ваших объектов.

Вы можете просто получить все ключи с помощью библиотеки underscore.js. Это пример для верхнего уровня только:

_.keys(obj); 
// output : [ "a","b","g","h","l" ]; 

И ДоП: http://underscorejs.org/#keys

+0

Спасибо, но я сказал, что мне нужны все уровни в моем примере –

+0

Я только что дал путь для переадресации – throrin19

+0

Мне нужны как ключи, так и значения, а не только одно, спасибо. –

2

Попробуйте

var obj = { 
    "a": "a", 
     "b": [{ 
     "c": "c", 
      "d": "d" 
    }, { 
     "e": "e", 
      "f": "f" 
    }], 
     "g": true, 
     "h": { 
     "i": "i", 
      "j": "j", 
      "k": 1 
    }, 
     "l": "l" 
}; 

function x(obj, keys, vals) { 
    for (var key in obj) { 
     if (obj.hasOwnProperty(key)) { 
      var val = obj[key]; 
      keys.push(key); 
      vals.push(val); 
      if (typeof val == 'object') { 
       //borrowed from angularjs isArray 
       //http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js 
       if (toString.apply(val) == '[object Array]') { 
        for (var i = 0; i < val.length; i++) { 
         x(val[i], keys, vals) 
        } 
       } else { 
        x(val, keys, vals) 
       } 
      } 
     } 
    } 
} 

var keys = [], 
    vals = []; 
x(obj, keys, vals); 
console.log(keys) 
console.log(vals) 

Демо: Fiddle

+0

Ты легенда. Это именно то, что мне нужно! –

+0

На самом деле это выглядит немного с моим большим например, http://jsfiddle.net/shannonhochkins/vUnF9/842/ Обратите внимание, что идентификатор не соответствует третьему ключу, по какой-либо причине есть и объект на третьем ключе, знаете ли вы, почему? –

+0

@ShannonHochkins это выглядит хорошо для меня http://jsfiddle.net/arunpjohny/69enZ/7/ ... текстовое представление выглядит как проблема, потому что поскольку у вас есть массив в качестве результата .. он будет напечатан как «Объект , Object " –

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