nodejs我如何使用多维数组并在其中推送值?

时间:2017-07-25 06:36:09

标签: arrays node.js multidimensional-array

我正在尝试从第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')] );
}

3 个答案:

答案 0 :(得分:2)

使用filtermap

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'];

我已经使用了更多代码让您理解正确,一旦理解,就可以减少它。