我正在尝试从第3部分API获取的数据中创建新的multidimensional array
。
"output":[
{
"is_indb":false,
"name":"adam",
"tokens":29
},
{
"is_indb":true,
"name":"aaron",
"tokens":2,
},
{
"is_indb":false,
"name":"adam",
"tokens":3,
},
{
"is_indb":false,
"name":"axel",
"tokens":5,
},
{
"is_indb":false,
"name":"andy",
"tokens":5,
},
{
"is_indb":false,
"name":"bob",
"tokens":5,
},
{
"is_indb":false,
"name":"aldo",
"tokens":5,
},
{
"is_indb":false,
"name":"julia",
"tokens":5,
}
]
我想创建一个新的array
并用响应中的数据填充它。
但我想做一些预先检查,如
只接受那些is_indb = false
只接受姓名以a
所以最终的数组将是is_indb = true
和名称以a
开头的所有人
var newaray = [[adam,29],[adam,3],[axel,5],[andy,5],[aldo,5]];
到目前为止,我已尝试使用_pluck
并获得一些奇怪的输出。我能够使用_pluck
获取圣经元素,但无法获得多个项目。
我可以想到像这样的逻辑
var newaray = [];
if( (_pluck(msg.output,'is_indb') == false && ((_pluck(msg.output,'name').substring(0, 1) == "a")){
newaray.push( [ _.pluck(msg.output, 'name') , _.pluck(msg.output, 'token')] );
}
答案 0 :(得分:2)
使用filter
和map
:
var filteredOutput = output
.filter(function(elem) {
// The return statement should return true,
// if you want the element to pass into the new array.
return elem.is_indb === false && typeof elem.name === "string" && elem.name.indexOf('a') === 0;
})
.map(function(elem) {
return [elem.name, elem.tokens];
});
或与ES6:
let filteredOutput = output
.filter(elem => elem.is_indb === false && typeof elem.name === "string" && elem.name.indexOf('a') === 0)
.map(elem => [elem.name, elem.tokens])
使用ES6并使用正则表达式(灵感来自Peter Grainger
的答案,但也不区分大小写):
let filteredOutput = output
.filter(elem => elem.is_indb === false && /^a/i.test(elem.name))
.map(elem => [elem.name, elem.tokens])
顺便说一下,你发布的是一个对象数组,而不是一个多维数组,它是一个数组数组。
答案 1 :(得分:2)
您可以使用过滤器然后使用地图吗?
const output = [
{
"is_indb":false,
"name":"adam",
"tokens":29
},
{
"is_indb":true,
"name":"aaron",
"tokens":2,
},
{
"is_indb":false,
"name":"adam",
"tokens":3,
},
{
"is_indb":false,
"name":"axel",
"tokens":5,
},
{
"is_indb":false,
"name":"andy",
"tokens":5,
},
{
"is_indb":false,
"name":"bob",
"tokens":5,
},
{
"is_indb":false,
"name":"aldo",
"tokens":5,
},
{
"is_indb":false,
"name":"julia",
"tokens":5,
}
]
const transform = output.filter(value => /^a/.test(value.name) && !value.is_indb)
.map(value => [value.name, value.tokens])
console.log(transform)

答案 2 :(得分:0)
您可以使用_.filter并以此形式获取输出
op = [{ obj1 } ,{obj2}];
但是,如果你想删除一些键,那么你可以使用_.pick
var op = _.filter(ip , function(obj){
if(obj.is_indb == false && obj.name[0] == 'a'){
return true;
}
else{
return false;
}
})
//so now you have all the entries filtered out
var opAltered = _.pick(op,['name','tokens']);
//you will get this result
/*
opAltered = [
{
name : <something>,
tokens : <something>
},{
...
}
]
*/
或者如果你想要数组,你可以使用这个
opAltered = _.map(op,['name','tokens'];
我已经使用了更多代码让您理解正确,一旦理解,就可以减少它。