假设我有一个对象数组,看起来类似于这样:
有没有一种方法可以轻松地将每个对象的.users数组合并成一个数组?
[
{
id: ...,
name: "...",
users: [1, 2, 3]
},
...
]
有没有一种方法可以轻松地将每个对象的.users数组合并成一个数组?
[
{
id: ...,
name: "...",
users: [1, 2, 3]
},
...
]
var result = _.flatten(_.pluck(data, 'users'));
编辑
正如Richard所指出的,在lodash 4.0.0版本中删除了pluck函数,但在撰写本文时的最新版本的underscore(1.8.3)中仍然存在。
使用map函数替换pluck可以同时适用于lodash和underscore:
var result = _.flatten(_.map(data, 'users'));
var data = [{
id: ...,
name: "...",
users: [1, 2, 3]
},
...
];
var allUsers = [];
data.forEach(function(obj){
allUsers = allUsers.concat(obj.users);
});
console.log(allUsers);
演示
var data = [{
id: 1,
name: "...",
users: [1, 2, 3]
},
{
id: 2,
name: "....",
users: [4, 5, 6]
},
{
id: 3,
name: "...",
users: [7, 8, 9]
},
];
var allUsers = [];
data.forEach(function(obj){
allUsers = allUsers.concat(obj.users);
});
document.querySelector("#log").innerHTML = allUsers.join(",");
<div id="log"></div>
使用lodash:
var objects = [
{
id: "...",
name: "...",
users: [1, 2, 3]
},
{
id: "...",
name: "...",
users: [4, 5, 6]
},
//...
];
var allUsers = _.flatMap(objects, function(o){return o.users;});
console.log(allUsers);
// allUsers: [1,2,3,4,5,6]
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
users
数组值的新数组。我使用Array.prototype.reduce
来保持一切都被包含,但你也可以用for
循环实现。var data = [{id: 1, name: "A", users: [1, 2, 3]},
{id: 2, name: "B", users: [4, 5, 6]},
{id: 3, name: "C", users: [7, 8, 9]}];
var allUsers = data.reduce(function (result, current) {
Array.prototype.push.apply(result, current.users);
return result;
}, []);
Array.prototype.push
的原因是修改现有的数组,而不是通过使用类似 Array.prototype.concat
的方法来创建多个副本。Array.prototype.push
方法:var res = [];
for (var i = 0; i < o.length; i++) {
res.push.apply(res, o[i].users);
}
如果数组应该包含唯一元素:
res = res.filter(function(val, i, arr) {
return arr.indexOf(val) === i;
});
res.push(o[i].users);
- RyanFunction.prototype.apply
方法。apply
的工作方式可能会让人感到困惑,但它并不是一种 hackish 的方法。 - Ramvar a = [
{
id: 1,
name: "...",
users: [1, 2, 3]
},
...
];
var res = new Array();
for(var i = 0; i < a.length; i++) {
a[i].users.forEach(function(val) { res.push(val); }
);
这可能不是最有效的方法,但它可以实现你想要的功能。
在这里查看fiddle:http://jsfiddle.net/TylersDesk/3x1w8y95/
var objects = [
{
time: 1234,
users: ["Joe", "Bob", "Blake"]
},
{
time: 1234,
users: ["Annie", "Gale"]
}
]
var allUsers = []
for (i=0; i<objects.length; i++) {
for (key in objects[i]) {
if (key === "users") {
console.log('found users');
console.log(objects[i][key]);
for (g=0; g<objects[i][key].length; g++) {
console.log(objects[i][key][g]);
//Add to array
allUsers.push(objects[i][key][g]);
}
}
}
}
//Output all users
console.log(allUsers);