【问题标题】:Separating key value pairs into two variables with for loop使用 for 循环将键值对分成两个变量
【发布时间】:2014-05-31 05:36:56
【问题描述】:

编辑:不要这样做。这是我刚接触编程时尝试过的一种愚蠢的做法

我有一个数组中的 32 条数据的列表,它们像这样配对

"foo:bar","baz:example","cat:dog"

并且我想遍历该数组并在与用户输入匹配的对上停止。因此,例如,如果用户输入“foo”,它将分别返回“foo”和“bar”,如果用户输入“bar”,它将同时返回“foo”和“bar”。没有重复的值。

现在我有一个带有if 语句的大表。所以if用户的输入是x,那么它就返回了正确的值。我必须手动进行匹配,并且我假设循环遍历数组直到找到正确的值将比 64 个不同的ifs 更有效。

我使用 两个 单独的数组尝试过类似的操作(只是一个示例):

for (var i=0;i<array.length;i++) {
    if (array[i] === user_input) {
        var index = indexOf(array[i]);
    break;
    }
}

然后使用index变量作为每个数组中值的索引号,但它返回undefined

我也试过这个:Separate key and value pairs into two arrays

但它给了我 all 数组中的值,这是我不想要的。我只想要用户输入的一个特定值。虽然我可以使用索引号选择数组的一个特定部分,但我不知道如何使该部分动态化(例如,根据用户输入的内容进行更改)。

甚至有可能做到这一点吗?如果没有,最好的方法是什么?

谢谢。

【问题讨论】:

  • cat,dogcat:dog?
  • @AmitJoki cat:dog。抱歉,打错字了。

标签: javascript arrays if-statement for-loop


【解决方案1】:

你可以这样做:

function getPair(arr, search) {
    var rtn = arr.filter(function (v, i) {
        return new RegExp("\\b" + search + "\\b").test(v);
    })[0];
    return rtn ? rtn.split(':') : -1;
}

像这样使用它:

var array = ["foo:bar","baz:example","cat:dog"];
getPair(array, "foo"); //  ["foo","bar"]

注意:如果在数组中没有找到搜索字符串,上述函数返回-1

【讨论】:

  • 仍然在 10% 左右,所以我会再远离功能性的东西几年。 +1,因为我还没有经常看到这个。
  • 你不经常看到什么? IE 倒计时?
  • 这就像一个魅力。谢谢 Amit Joki 和 @MartinKonecny,你们都给了我一个愚蠢问题的好答案!
  • @eric_lagergren,很高兴能帮助你,IMO,这不是一个愚蠢的问题
  • 请注意 getPair(array,"f") 也将返回 ["foo","bar"]。 getPair(array, "ample") 将返回 ["baz","example"]
【解决方案2】:

这是一个遍历数组并检查user_input 是否在任何地方的函数。如果是这样,它将返回找到匹配的字符串。

function getPair(array, user_input) {
  for (var i=0;i<array.length;i++) {
      var pair = array[i].split(':');
      if (pair.indexOf(user_input) >= 0) {
          return pair;
      }
  }
  return [];
}

var array = ["foo:bar","baz:example","cat:dog"];
getPair(array, "foo"); //will return ['foo', 'bar']
getPair(array, "bar"); //will return ['foo', 'bar']
getPair(array, "dog"); //will return ['cat', 'dog']
getPair(array, "zzz"); //will return []

【讨论】:

  • 嗯...我的意图是将两个值分开,因此搜索“foo”将分别返回“foo”和“bar”。 getPair(array, "foo").split(":"); 然后将 [0] 和 [1] 分配为单独的变量会不会太笨拙?我需要对这两个值进行数学运算。
  • @eric_lagergren,像我的回答一样吗?
  • 没有拆分是一个完美的用途。已更新。
【解决方案3】:

我建议使用对象。首先,转换你的数组:

var pair,obj1={},obj2={};
for (var i=0;i<array.length;i++) {
  pair=array[i].split(":");
  obj1[pair[0]]=pair[1];
  obj2[pair[1]]=pair[0];
}

这将为您提供以下对象:

obj1={
  "foo":"bar",
  "baz":"example",
  "cat":"dog"
};
obj2={
  "bar":"foo",
  "example":"baz",
  "dog":"cat"
};

然后根据用户输入:

if (obj1[user_input]) {return [user_input,obj1[user_input]];}
else if (obj2[user_input]) {return [obj2[user_input],user_input];}
else return undefined;

现场演示:http://jsfiddle.net/x23qG/

【讨论】:

  • 刚刚注意到您的回复,抱歉。对象比数组工作得更好是有原因的吗?我是 JavaScript 新手,从我在这里看到的:jsperf.com/array-vs-object-performance 数组更快。
  • @eric_lagergren 在我的回答中,只需查看表达式以检索值,您无法击败它!
  • 实际上它非常简单,但是一个对象不会只给我“对”的第二部分吗?所以 obj["foo"] 返回 "bar" 因为,至少在我的场景中,我需要这两个部分。
  • @eric_lagergren 在性能方面,这个答案会比接受的答案更好。但是如果你看一下测试,你会发现我们在谈论极短的操作!因此在实践中没有显着差异。
  • 如果用户输入的是“foo”,那么你已经有了第一部分,对吧:-)
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多