Javascript 将所有玩家的列表重新检索到一个数组中

Javascript 将所有玩家的列表重新检索到一个数组中,javascript,arrays,object,Javascript,Arrays,Object,我有这个json对象 var server = [{ name: 'xVg1', players: ['foo', 'bar','player1'], status: "on", origin:"", }, { name: 'xVg2', players: ['foo1', 'bar1','player2'], status: "off", origin:"", }, { name: 'xVg3', players: ['foo2', 'bar2','pl

我有这个json对象

var server = [{
  name: 'xVg1',
  players: ['foo', 'bar','player1'],
  status: "on",
  origin:"",
}, {
  name: 'xVg2',
  players: ['foo1', 'bar1','player2'],
  status: "off",
  origin:"",
}, {
  name: 'xVg3',
  players: ['foo2', 'bar2','player3'],
  status: "on",
  origin:""
}];
我正在寻找一种有效的方法,从这个对象将所有玩家的名字检索到一个数组中,我需要实现这个结果

player=['foo', 'bar','player1','foo1', 'bar1','player2','foo2', 'bar2','player3']
我使用了forEach循环,但它没有达到我想要的效果,结果是一个数组,我希望它变成一个数组,就像上面的结果一样

var arr=[]
server.forEach(val =>{
   arr.push(val.players)
})
使用

更新自

arr.push(val.players)

var服务器=[{
名称:“xVg1”,
玩家:['foo'、'bar'、'player1'],
状态:“开”,
来源:“,
}, {
名称:“xVg2”,
玩家:['foo1'、'bar1'、'player2'],
状态:“关闭”,
来源:“,
}, {
名称:“xVg3”,
玩家:['foo2','bar2','player3'],
状态:“开”,
来源:“”
}];
var arr=[]
server.forEach(val=>{
arr=arr.concat(val.players)
})

控制台日志(arr)使用reduce和spread运算符,您可以在一行代码中获得结果

var服务器=[{
名称:“xVg1”,
玩家:['foo'、'bar'、'player1'],
状态:“开”,
来源:“,
}, {
名称:“xVg2”,
玩家:['foo1'、'bar1'、'player2'],
状态:“关闭”,
来源:“,
}, {
名称:“xVg3”,
玩家:['foo2','bar2','player3'],
状态:“开”,
来源:“”
}];
var players=server.reduce((x,y)=>[…x,…y.players],];
console.log(players)
您可以将
reduce()
.concat()一起使用:

或使用扩展语法:

let result = server.reduce((a, c) => (a.push(...c.players), a), []);
演示:

let server=[{name:'xVg1',玩家:['foo','bar','player1'],状态:“开”,原点:},{name:'xVg2',玩家:['foo1','bar1','player2'],状态:“关”,原点:},{name:'xVg3',玩家:['foo2','bar2','player3'],状态:“开”,原点:};
让result=server.reduce((a,c)=>a.concat(c.players),[]);
控制台日志(结果)

。作为控制台包装{最大高度:100%!重要;顶部:0;}
使用排列

var服务器=[{
名称:“xVg1”,
玩家:['foo'、'bar'、'player1'],
状态:“开”,
来源:“,
}, {
名称:“xVg2”,
玩家:['foo1'、'bar1'、'player2'],
状态:“关闭”,
来源:“,
}, {
名称:“xVg3”,
玩家:['foo2','bar2','player3'],
状态:“开”,
来源:“”
}];
var res=服务器减少((acc,c)=>{
acc.push(…c.players);
返回acc;
}, []);

控制台日志(res)这可能是另一种处理方法。只是为了好玩:)

var服务器=[{
名称:“xVg1”,
玩家:['foo'、'bar'、'player1'],
状态:“开”,
来源:“,
}, {
名称:“xVg2”,
玩家:['foo1'、'bar1'、'player2'],
状态:“关闭”,
来源:“,
}, {
名称:“xVg3”,
玩家:['foo2','bar2','player3'],
状态:“开”,
来源:“”
}];
var players=server.map(e=>e.players)
玩家=[].concat.apply([],玩家)

console.log(players)
因为您使用的是
forEach()
,所以在
forEach()
内部可以使用
Spread\u语法

演示

const服务器=[{
名称:“xVg1”,
玩家:['foo'、'bar'、'player1'],
状态:“开”,
来源:“,
}, {
名称:“xVg2”,
玩家:['foo1'、'bar1'、'player2'],
状态:“关闭”,
来源:“,
}, {
名称:“xVg3”,
玩家:['foo2','bar2','player3'],
状态:“开”,
来源:“”
}];
让结果=[];
server.forEach(obj=>{
结果。推挤(…目标球员);
});
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
使用一个库,它提供了大量有用的函数式编程帮助程序,而不扩展任何内置对象

var a=[{
名称:“xVg1”,
玩家:['foo'、'bar'、'player1'],
状态:“开”,
来源:“,
}, {
名称:“xVg2”,
玩家:['foo1'、'bar1'、'player2'],
状态:“关闭”,
来源:“,
}, {
名称:“xVg3”,
玩家:['foo2','bar2','player3'],
状态:“开”,
来源:“”
}];
var结果=u.flatte(uu.pull(a,“玩家”));

控制台日志(结果)
server
是一个对象数组。为什么要均匀分布呢,
a.concat(c.players)
也是这样做的。然后你就不需要逗号运算符了。@Yoshi谢谢你的输入,我已经更新了我的答案。@Yoshi实际上我认为
.conact()
.push()
效率更低,因为它总是创建一个新数组然后返回它。@MohammadUsman是的,这可能是真的,但除非这成为一个可测量的问题,为什么还要为更难阅读的版本而烦恼呢?
let result = server.reduce((a, c) => a.concat(c.players), []);
let result = server.reduce((a, c) => (a.push(...c.players), a), []);