如果一个值,则将参数作为字符串数组获取

时间:2019-01-08 11:59:36

标签: typescript get google-cloud-firestore

我正在尝试将字符串数组作为GET调用的参数:

// One value
param: filters=Something
value: filters: 'Something'

// Multiple values
param: filters=Something&filters=Something else
value: filters: [ 'Something', 'Something else' ]

问题在于,当我在参数中传递一个值时,代码认为它传递了一个字符串,而当我传递更多的值时,则我获得了字符串数组。

我尝试了诸如Array.from等之类的东西,但是它只是根据字符串创建一个数组:

['S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

我需要一种方法来强制将单个值读取为String数组。有什么可以做的吗?

编辑:

我得到查询,我需要过滤器值来过滤结果并将其发回。当filter参数中有一个值时,它将视为一个字符串并将其切碎。我需要/希望它是一个具有一个字符串值的数组。

1 个答案:

答案 0 :(得分:1)

在评论中您说过:

  

问题不是我如何创建查询,而是如何从参数中获取字符串数组,即使它只是一个值。

如果您之前至少看过一次参数,则可以遍历查询字符串参数并按需构建一个数组:

function getParameters(query)/*: Map<String,String> */ {
  const m = new Map/*<String,String>*/();
  for (const part of query.split("&")) {
    let [key, value] = part.split("=");
    key = decodeURIComponent(key); // People commonly miss out this bit
    vale = decodeURIComponent(value);
    if (m.has(key)) {
      let current = m.get(key);
      if (Array.isArray(current)) {
        current.push(value);
      } else {
        m.set(key, [current, value]);
      }
    } else {
      m.set(key, value);
    }
  }
  return m;
}

const query1 = "filters=Something&foo=bar";
const query2 = "foo=bar&filters=Something&filters=Something%20else";

console.log("query1's params:", [...getParameters(query1).entries()]);

console.log("query2's params:", [...getParameters(query2).entries()]);
.as-console-wrapper {
  max-height: 100% !important;
}

或者,如果您总是想要一个用于特定参数的数组,则在这种情况下,请检查键和分支:

const arrayParams = Object.assign(Object.create(null), {
  filters: true
});
function getParameters(query)/*: Map<String,String> */ {
  const m = new Map/*<String,String>*/();
  for (const part of query.split("&")) {
    let [key, value] = part.split("=");
    key = decodeURIComponent(key); // People commonly miss out this bit
    vale = decodeURIComponent(value);
    if (arrayParams[key]) {
      // Array parameter
      if (m.has(key)) {
        m.get(key).push(value);
      } else {
        m.set(key, [value]);
      }
    } else {
      // Non-array parameter, may or may not have multiple values (or maybe you take the last, etc.)
      if (m.has(key)) {
        let current = m.get(key);
        if (Array.isArray(current)) {
          current.push(value);
        } else {
          m.set(key, [current, value]);
        }
      } else {
        m.set(key, value);
      }
    }
  }
  return m;
}

const query1 = "filters=Something&foo=bar";
const query2 = "foo=bar&filters=Something&filters=Something%20else";

console.log("query1's params:", [...getParameters(query1).entries()]);

console.log("query2's params:", [...getParameters(query2).entries()]);
.as-console-wrapper {
  max-height: 100% !important;
}