Javascript 将所有玩家的列表重新检索到一个数组中
我有这个json对象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
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), []);