【问题标题】:Search node js array for partial match with variable, return index or value搜索节点js数组与变量,返回索引或值的部分匹配
【发布时间】:2018-03-24 22:51:55
【问题描述】:

大家好,我是 node 和 js 的新手 - 试图为一个小的不和谐频道制作一个小机器人,我有点碰壁,找不到解决方案。

我正在尝试存储用户输入数据并稍后调用。到目前为止,我已经将数据存储为 json 文件。

data[user_id] = value_set
var out_data = JSON.stringify(data);
fs.writeFile('users.json', out_data);

看起来像这样:

{"35978432146597841":"String.1","32146879124653147":"String.2"}

现在我想稍后根据用户的 id 调用 String.X 值。这就是我卡住的地方。我想我需要读取 json 文件并将其传输到数组中。

我想我成功地将它做成了一个数组:

var in_data = fs.readFileSync('users.json');
var data = JSON.parse(in_data);

var arr = []
for(var i in data){
arr.push([i, data [i]]);}

作为... 控制台.log(arr[1]);

显示: ['32146879124653147','String.2']

但我不知道如何通过用户的 id (user_id) 搜索该数组以定位索引然后拆分值,或者更好地只是提取值。

我试图通过 user_id 找到“String.X”的一切都失败了。 那么如果我只知道'32146879124653147',我需要做什么来拉'String.2'。

任何帮助将不胜感激。谢谢。

解决方案

var fs = require("fs");
var in_data = fs.readFileSync('users.json');
var data = JSON.parse(in_data);
var arr = [];

for(var i in data){
    arr.push({
            User:i,
            Input:data [i]
            });
        }
var value = arr.find(x => x.User === id);
var f_value = value.Input;
console.log(f_value);

const userfile = require("./users.json");
var f_value = userfile[userID];

【问题讨论】:

    标签: arrays node.js search find contains


    【解决方案1】:

    在 Jay 的大力帮助下,这是我想出的答案。

    var fs = require("fs");
    var in_data = fs.readFileSync('users.json');
    var data = JSON.parse(in_data);
    var arr = [];
    
    for(var i in data){
        arr.push({
                User:i,
                Input:data [i]
                });
            }
    var value = arr.find(x => x.User === userID);
    var f_value = value.Input;
    console.log(f_value);
    

    其他

    从那以后,我找到了一种更简单的方法来完成上述操作,无需 fs 或创建数组。

    const userfile = require("./users.json");
    var f_value = userfile[userID];
    

    【讨论】:

      【解决方案2】:

      您可以使用find()。在您的示例中,它将返回匹配的第一个键/值,如果没有匹配,则返回 undefined。

      var in_data = fs.readFileSync('users.json');
      var data = JSON.parse(in_data);
      
      let obj = {}
      for(var i in data){
      
      obj[i]:data [i];
      
      let value = obj.find(value => id)
      //if id = '32146879124653147' 
      // then the 32146879124653147: 'String.2' key/value would be returned
      

      【讨论】:

      • 也许我做错了什么,但 let value = arr.find(value => id) 只返回数组的第一部分。所以 arr[0]。即使出于故障排除的目的,我手动输入 value = arr.find(value => '32146879124653147'),它没有返回 ['32146879124653147','String.2'] 它返回 ['35978432146597841',"String.1' ]
      • 我不确定,我认为这会返回数组。构建时可以将其存储在键值对而不是数组中吗? arr.push({[i]: 数据[i]})。然后使用 find()。
      • 我可以尝试,并且想这样做,但无法弄清楚如何。这将如何改变 find()。
      • 只是将 "arr.push([i, data [i]])" 更改为 "arr.push({[i]: data[i]})" 并没有改变返回值。使用 obj[i]:data [i];我收到一个错误“意外令牌:”我在最后添加了一个大括号“}”,认为这可能是问题但没有改变。
      • 我终于明白了,感谢所有的帮助 - 它让我弄清楚了。我不知道它是否是最优雅的,但它确实有效。我将在我的问题下发布解决方案并回答。
      【解决方案3】:

      您需要单独推送项目,然后在数组中跳过 2 个元素对其进行循环。

      var fs = require("fs");
      
      var in_data = fs.readFileSync('users.json');
      var data = JSON.parse(in_data);
      
      var arr = []
      for(var i in data){
        arr.push(i);
        arr.push(data[i]);
      }
      
      console.log("Printing arr...");
        for(var i=0; i<arr.length; i++) {
          console.log("arr[" + i + "]= " + arr[i]);
        }
      
        // Check if 32146879124653147 is found
      
        console.log("Checking 32146879124653147...");
        for (var i=0; i<arr.length; i+=2) {
      
          if (arr[i] === "32146879124653147") {
            console.log("Found " + arr[i+1]);
          }
        }
      

      【讨论】:

      • 感谢您的回答,我可能读错了,但上面看起来您需要知道字符串值。但这将是未知的,并且是用户存储的内容。我只会知道用户 ID,并将使用它来查找他们存储的数据。
      • 根据用户 ID 值更改。
      • 第一个 for 循环工作并打印出每个数组。打印 arr... arr[0]= 35978432146597841,String.1 arr[1]= 32146879124653147,String.2 并继续检查 32146879124653147... 但随后停止打印任何内容。 if 而不是 console.log("Found " + arr[i+1]);我做 var value = arr[i+1] console.log(value);它打印未定义。
      猜你喜欢
      • 2012-10-04
      • 2016-05-15
      • 2016-01-02
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      相关资源
      最近更新 更多