【问题标题】:nodejs how can i use multidimensional array and push values in it?nodejs我如何使用多维数组并在其中推送值?
【发布时间】:2017-12-30 22:13:54
【问题描述】:

我正在尝试根据我从第 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 获取 sible 元素,但无法获取多个项目。

我能想到这样的逻辑

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

【问题讨论】:

    标签: arrays node.js multidimensional-array


    【解决方案1】:

    使用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])
    

    顺便说一句,你发布的是一个对象数组,而不是多维数组,它是一个数组数组。

    【讨论】:

    • 当我执行 console.log(filteredOutput) 时,我得到的是空数组。 [] [] []
    • 你的 output 变量是什么样的?
    • msg = JSON.parse(packet.utf8Data).x 然后使用 msg.output
    • 那么,你过滤msg.output了吗?该代码对我有用 - 我只得到 aaron,这是唯一符合您条件的对象。
    • @AMB 我已经编辑了代码以说明您的编辑,它要求过滤器选择 is_indb === false 而不是 true 的元素。
    【解决方案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)

    【讨论】:

    • 这不能回答 OP 的问题,因为它没有按 is_indb 过滤。
    • 这是迄今为止最简单的代码。但是输出中显示了一些空的 [],我猜有些对象甚至没有满足我们条件的单个对象。
    • 它更简单,但如果您决定稍后更改,它也可能容易出错 (/^n/.test(null) === true)。
    • @AMB 这可能是因为未设置名称和/或值,您可以将其添加到过滤器中。 nadavvadan,同意,用正则表达式解决一个问题,现在你有两个问题:)
    【解决方案3】:

    您可以使用_.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'];
    

    我使用了更多代码让您正确理解,您可以在理解后减少它。谢谢。

    【讨论】:

    • if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); TypeError: [object Array] 不是函数
    • 我使用了 lodash var _ = require('lodash')
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多