2016-11-12 38 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

编辑:添加代码以除去尾随冒号字符,以匹配所请求的输出格式完全相同

仅有减少它这样:

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