首页 > 解决方案 > 如果有一个值,则将参数作为字符串数组获取

问题描述

我正在尝试将字符串数组作为 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']

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

编辑:

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

标签: typescriptgetgoogle-cloud-firestore

解决方案


在评论中你说:

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

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

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;
}


推荐阅读