2016-11-12 2 views
3

Я новичок в javascript и изо всех сил пытаюсь найти ответ на этот вопрос.Преобразование массива в javascript

У меня есть объект со списком сетевых интерфейсов и деталей. Я предполагаю, что это массив объектов ?:

> console.log(net); 
[ { Interface: 'wlan0:', 
    bytes: { Receive: '26087318', Transmit: '8475' }, 
    packets: { Receive: '379665', Transmit: '52' }, 
    errs: { Receive: '0', Transmit: '0' }, 
    drop: { Receive: '0', Transmit: '0' }, 
    fifo: { Receive: '0', Transmit: '0' }, 
    frame: { Receive: '0' }, 
    compressed: { Receive: '0', Transmit: '0' }, 
    multicast: { Receive: '0' }, 
    colls: { Transmit: '0' }, 
    carrier: { Transmit: '0' } }, 
    { Interface: 'lo:', 
    bytes: { Receive: '228483', Transmit: '228483' }, 
    packets: { Receive: '4046', Transmit: '4046' }, 
    errs: { Receive: '0', Transmit: '0' }, 
    drop: { Receive: '0', Transmit: '0' }, 
    fifo: { Receive: '0', Transmit: '0' }, 
    frame: { Receive: '0' }, 
    compressed: { Receive: '0', Transmit: '0' }, 
    multicast: { Receive: '0' }, 
    colls: { Transmit: '0' }, 
    carrier: { Transmit: '0' } }, 
    { Interface: 'mon0:', 
    bytes: { Receive: '285735889', Transmit: '0' }, 
    packets: { Receive: '1753373', Transmit: '0' }, 
    errs: { Receive: '0', Transmit: '0' }, 
    drop: { Receive: '1765559', Transmit: '0' }, 
    fifo: { Receive: '0', Transmit: '0' }, 
    frame: { Receive: '0' }, 
    compressed: { Receive: '0', Transmit: '0' }, 
    multicast: { Receive: '0' }, 
    colls: { Transmit: '0' }, 
    carrier: { Transmit: '0' } }, 
    { Interface: 'eth0:', 
    bytes: { Receive: '6982603', Transmit: '22526425' }, 
    packets: { Receive: '58906', Transmit: '384822' }, 
    errs: { Receive: '0', Transmit: '0' }, 
    drop: { Receive: '0', Transmit: '0' }, 
    fifo: { Receive: '0', Transmit: '0' }, 
    frame: { Receive: '0' }, 
    compressed: { Receive: '0', Transmit: '0' }, 
    multicast: { Receive: '0' }, 
    colls: { Transmit: '0' }, 
    carrier: { Transmit: '0' } } ] 

Я хочу, чтобы преобразовать в этот результат:

> console.log(result); 
{ lo: 'lo', 
    mon0: 'mon0', 
    eth0: 'eth0', 
    wlan0: 'wlan0' } 

Я попытался несколько вещей в консоли узел REPL, но я не получаю нигде :

> var result = {}; 
undefined 
> Object.keys(net).forEach(function(ifname) { 
... result[ifname] = ifname; 
... }); 
undefined 
> result 
{ '0': '0', '1': '1', '2': '2', '3': '3' } 

Другая попытка:

> procfs.net(function(err,net){ 
... result = net.map(function(a) {return a.Interface;}) 
... }); 
undefined 
> console.log(result); 
[ 'wlan0:', 'lo:', 'mon0:', 'eth0:' ] 
undefined 

я могу ссылаться на элементы данных, требуемые по отдельности, просто изо всех сил, чтобы поставить все это вместе:

> net[0].Interface 
'wlan0:' 
> net[1].Interface 
'lo:' 
> net[2].Interface 
'mon0:' 
> net[3].Interface 
'eth0:' 

Помощь оценили!

ответ

1

EDIT: добавлен код для удаления трейлинг двоеточие, чтобы соответствовать требуемому формату вывода точно

Просто уменьшить это так:

var result = net.reduce((ifaces,i) => { 
    var name = i.Interface.replace(/:$/,''); 
    ifaces[name]=name; 
    return ifaces; 
},{}) 

Пример вывода

>>result 
{ wlan0: "wlan0", lo: "lo", mon0: "mon0", eth0: "eth0" } 

В качестве альтернативы, вы можете использовать Lodash (https://lodash.com/):

_.keyBy(net.map(i=>i.Interface.slice(0,-1))) 

или другую утилиту библиотеки.

1

Вам необходимо принять значение из свойства Interface и присвоить этому значению тот же ключ в объекте.

var net = [{ Interface: 'wlan0:', bytes: { Receive: '26087318', Transmit: '8475' }, packets: { Receive: '379665', Transmit: '52' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '0', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }, { Interface: 'lo:', bytes: { Receive: '228483', Transmit: '228483' }, packets: { Receive: '4046', Transmit: '4046' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '0', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }, { Interface: 'mon0:', bytes: { Receive: '285735889', Transmit: '0' }, packets: { Receive: '1753373', Transmit: '0' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '1765559', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }, { Interface: 'eth0:', bytes: { Receive: '6982603', Transmit: '22526425' }, packets: { Receive: '58906', Transmit: '384822' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '0', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }], 
 
    result = {}; 
 

 
net.forEach(function (o) { 
 
    result[o.Interface] = o.Interface; 
 
}); 
 

 
console.log(result);

1

Это идеальный пример использования Array.reduce()!

net.reduce((interfaces, interface) => { 
    interfaces[interface.Interface.slice(0, -1)] = interface.Interface.slice(0, -1) 
    return interfaces 
}, {}) 

const net = [{ Interface: 'wlan0:', bytes: { Receive: '26087318', Transmit: '8475' }, packets: { Receive: '379665', Transmit: '52' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '0', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }, { Interface: 'lo:', bytes: { Receive: '228483', Transmit: '228483' }, packets: { Receive: '4046', Transmit: '4046' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '0', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }, { Interface: 'mon0:', bytes: { Receive: '285735889', Transmit: '0' }, packets: { Receive: '1753373', Transmit: '0' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '1765559', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }, { Interface: 'eth0:', bytes: { Receive: '6982603', Transmit: '22526425' }, packets: { Receive: '58906', Transmit: '384822' }, errs: { Receive: '0', Transmit: '0' }, drop: { Receive: '0', Transmit: '0' }, fifo: { Receive: '0', Transmit: '0' }, frame: { Receive: '0' }, compressed: { Receive: '0', Transmit: '0' }, multicast: { Receive: '0' }, colls: { Transmit: '0' }, carrier: { Transmit: '0' } }] 
 

 
const result = net.reduce((interfaces, interface) => { 
 
    interfaces[interface.Interface.slice(0, -1)] = interface.Interface.slice(0, -1) 
 
    return interfaces 
 
}, {}) 
 

 
console.log(result)

+0

В результате «[wlan0:», «lo:», «mon0:», «eth0:"] ", а не" {lo: 'lo', mon0: 'mon0', eth0: 'eth0' , wlan0: 'wlan0'}} ", тогда как это может работать так же хорошо (в зависимости от дальнейшей логики), это все равно другой вывод. – zeppelin

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