2015-10-14 5 views
7

Мне нужно преобразовать массив объектов в объект. Я сделал с логикой ниже. Есть ли лучший способ справиться с этим?Лучший способ преобразования массива объектов в объект?

Fiddler Version

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 

 
for (var i = 0; i < before.length; i++) { 
 
    var keys = Object.keys(before[i]); 
 

 
    after[keys] = before[i][keys]; 
 
} 
 

 
console.log(after) 
 
document.writeln(JSON.stringify(after))

+0

ваша версия не соответствует действительности, если '{а: 1, Ь: 4, ....}' объекта, ключ будет более одного. –

+0

Ваш подход работает только потому, что каждый из внутренних массивов имеет только один ключ. С более чем одним он потерпит неудачу. Вам нужен второй цикл. – Yoshi

ответ

6

Вы можете использовать forEach перебрать массив, и вы забыли перебрать вложенный массив, если имеется несколько элементов внутри объекта.

Таким образом, код в вопросе не будет работать для

var arr = [{'a': 'b', 'c': 'd'}]; 

Demo

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 

 
before.forEach(function(obj) { 
 
    // obj here is the element of the array, i.e. object 
 

 
    // Looping over all the keys of the object 
 
    Object.keys(obj).forEach(function(key) { 
 
    // key here is the key of the object 
 
    after[key] = obj[key]; 
 
    }); 
 
}); 
 

 
console.log(after); 
 
document.writeln('<pre>' + JSON.stringify(after, 0, 2) + '</pre>');

+0

Благодарим за отзыв. Мне также необходимо изменить формат даты от типа строки до даты. Я обновил фрагмент кода. Насколько эффективно я могу конвертировать? –

+1

@PremkumarJayaseelan Пожалуйста, задайте другой вопрос для изменения формата даты. – Tushar

+0

Привет, брат, Спасибо за 'JSON.stringify (after, 0, 2)'. Я не знал. Что вы думаете о моем ответе. Можете ли вы мне посоветовать (хорошо это или нет)? –

3

Мы используем лучшие из функционального программирования в JavaScript:

reduce Использование нам не нужно, чтобы добавить временные переменные внешней области.

for (var i in obj), как правило, быстрее, чем Obj.keys(obj).forEach: https://jsperf.com/for-in-versus-object-keys-foreach

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 
var after = before.reduce(function(dst, src){ 
 
    // import every key: val in src into dst 
 
    // and keep doing it for every element in the array. 
 
    for (var key in src) 
 
    if ({}.hasOwnProperty.call(src, key)) 
 
     dst[key] = src[key]; 
 
    return dst; 
 
}, {}); // start with an empty object to avoid modifying items in before array. 
 

 
document.writeln("<pre>" + JSON.stringify(after, null, 4) + "</pre>")

+0

Только для кода ответы не являются оптимальными. Вы должны объяснить, почему ваш код соответствует требованиям OP. – RobG

1

Как насчет Object.assign?

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 

 
before.map(function(i){ 
 
    return Object.assign(after,i); 
 
}) 
 

 

 
console.log(after) 
 
document.writeln(JSON.stringify(after))

3

В последних браузерах [ECMAScript 5], мы имеем reduce, который возвращает объект

попробовать ниже

var before = [{"x":["2015-10-14T01:59:59.999+05:30","2015-10-14T03:59:59.998+05:30","2015-10-14T05:59:59.997+05:30","2015-10-14T07:59:59.996+05:30","2015-10-14T09:59:59.995+05:30","2015-10-14T11:59:59.994+05:30","2015-10-14T13:59:59.993+05:30","2015-10-14T15:59:59.992+05:30","2015-10-14T17:59:59.991+05:30","2015-10-14T19:59:59.990+05:30","2015-10-14T21:59:59.989+05:30","2015-10-14T23:59:59.988+05:30"]},{"CleanCoal":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"Middelings":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"Prime":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"SpiralProd":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]}]; 
 

 

 
var object = before.reduce(function(o, v, i) { 
 
    o[i] = v; 
 
    return o; 
 
}, {}); 
 

 
console.log(object);

Fiddle здесь http://jsfiddle.net/pscytrgj/

+1

* reduce * не обязательно возвращает объект, он возвращает все возвращаемые вызовы в качестве аккумулятора (который может быть любым значением). MDN предоставляет [polyfill for * reduce *] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill), поэтому размещены более старые браузеры. – RobG

+0

@RobG Да, это правда! любопытное обучение для меня также :) Спасибо! –

2

Вы можете сделать это через JSON.stringify()

var before = [{ 
 
    "x": ["1", "2"], 
 
    y: { 
 
    a: 3 
 
    } 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00"], 
 
    b: 4 
 
}, { 
 
    "Middelings": ["0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 
var b = "", 
 
    i = -1; 
 
while (before[++i]) { 
 
    var str = JSON.stringify(before[i]); 
 
    b += str.slice(1, str.length - 1); 
 
    if (before[i + 1]) b += ","; 
 
} 
 
after = JSON.parse("{" + b + "}"); 
 
console.log(after); 
 
document.write("<pre>" + JSON.stringify(after, 0, 3) + "</pre>")

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