我需要验证、更新、转义数据对象中对象或数组中的每个值字符串,数据总是在改变这一基本方案.我有这个代码是工作的,可以做到better or do less depth of recursion吗?

let data = {
  "data": "general",
  "another" : ["fbdfdfdfdfdfdfdfdf", "somestring2"],
  "MyStringArray" : ["valid_type.pathdir", "/pathdir/desdss"],
  "html_data":  [
      {
      "data": [
          {
            "item_title": "Server Version:",
          },
          ["fbdfdfdfdfdfdfdfdf", "somestring2"],
          {
            "value_title": "2.0.1"
          }
        ]
      },
      {
      "head_title": "Info app",
      "data": [
          {
            "value_title": "1.0.1"
          },
          {
            "item_title": "javascript Version:",
          }
        ]
      }
  ]
};
    
let counter = 0
let limit_recursion = 150

    
function funct(object) {

  if ( counter > limit_recursion ) {
    throw new Error("limit exceeded, maximum recursion allowed is " + limit_recursion );
  }
  

  for ( let key in object ) {

    if (typeof object[key] === "string") {
      object[key] = validate_escape(object[key]);
    }
    else if ( _has_array_to_validate_get_string(object[key]) ) { // ["valid_type.pathdir", "/pathdir/desdss"],

      object[key][1] = validate_escape(object[key][0], object[key][1]);

    }
    else if ( Array.isArray(object[key]) && object[key].every(item => typeof item === "string")  ) {

      object[key].forEach((value, index) => {
        object[key][index] = validate_escape(value);
      });

    }
    else if ( Array.isArray(object[key]) && object[key].every(    item => typeof item === "object" && !Array.isArray(item)     )  ) {

      object[key].forEach((value) => {
        funct(value);
      });

    }
    else if (typeof object[key] === 'object' && !Array.isArray(object[key]) ) {

      funct(object[key])

    }
    else if ( Array.isArray(object[key] ) ) {

      funct(object[key])

    }

      counter++;
  }

  return object;

}

关于这里的_has_array_to_validate_get_string,我使用了一个数组来存储键和值来检测类型字符串验证.

大约validate_escape个,是内部类做验证,更新,转义.

function _has_array_to_validate_get_string(array) {
  return Array.isArray(array) && array.length === 2 && typeof array[0] === "string" && array[0].includes('valid_type');
}

function validate_escape(var1, var2) {
  return var1 + var2;
}

推荐答案

这个答案得到的结果和你问题中的一样,但我认为这两个答案可能都有问题.它用像"somestring2undefined"这样的值填充您的对象,将"undefined"附加到几乎所有东西上,因为我们只用一个参数调用validate_escape.我猜这是一个简单的解决方案,但我并不真正理解其中的要求.

说到需求,你的问题真的需要注意一下.你发布了一个代码块,并要求它的更好版本,但你从来没有解释过它的作用,没有包括一个可运行的代码片段,而你很容易就能包括它,并且其中有这个奇怪的"undefined"个问题.


使用两个小的帮助器函数(transformmapObject),我们可以将您的函数重写为{test, handle}对的简单集合,它们根据需要执行单个转换和递归.

funct以上的替换将如下所示:

const funct = transform ([
  {test: (v) => typeof v == 'string', handle: (v) => validate_escape(v)},
  {test: (v) => _has_array_to_validate_get_string(v), handle: ([x, y]) => [x, validate_escape(x, y)]},
  {test: (v) => Array.isArray(v), handle: (v, recur) => v.map(recur)},
  {test: (v) => typeof v == 'object', handle: (v, recur) => mapObject(recur)(v)},
])

mapObject是一个相当平凡的函数,将map的概念应用于平面对象,因此,例如,

map(n => n * n)({a: 1, b: 2, c: 3, d: 4})

会屈服于

{a: 1, b : 4, c: 9, d: 16}

重要的函数是transform,它接受具有testhandle函数的对象array.它返回一个接受单个值的函数,并遍历这些对象以找到第一个用该值调用的test返回真实结果的对象.然后,它返回使用您的值调用handle函数的结果,并使用您可以用来递归调用相同配置的-transform函数的函数.如果它没有找到匹配的处理程序,它只返回输入值.

const transform = (handlers) => (v) =>
  (handlers.find(h => h.test(v)) || ({handle: (r, v) => v})).handle(v, transform(handlers))

const mapObject = (fn) => (o) =>
  Object.fromEntries(Object.entries(o).map(([k, v]) => [k, fn(v)]))

function _has_array_to_validate_get_string(array) {
  return Array.isArray(array) && array.length === 2 && typeof array[0] === "string" && array[0].includes('valid_type');
}

function validate_escape(var1, var2) {
  return var1 + var2;
}

const funct = transform ([
  {test: (v) => typeof v == 'string', handle: (v) => validate_escape(v)},
  {test: (v) => _has_array_to_validate_get_string(v), handle: ([x, y]) => [x, validate_escape(x, y)]},
  {test: (v) => Array.isArray(v), handle: (v, recur) => v.map(recur)},
  {test: (v) => typeof v == 'object', handle: (v, recur) => mapObject(recur)(v)},
])

const data = {data: "general", another: ["fbdfdfdfdfdfdfdfdf", "somestring2"], MyStringArray: ["valid_type.pathdir", "/pathdir/desdss"], html_data: [{data: [{item_title: "Server Version:"}, ["fbdfdfdfdfdfdfdfdf", "somestring2"], {value_title: "2.0.1"}]}, {head_title: "Info app", data: [{value_title: "1.0.1"}, {item_title: "javascript Version:"}]}]}


console.log(funct(data))
.as-console-wrapper {max-height: 100% !important; top: 0}

我们传递给transform的前两个帮助器是您的基本用例,它们处理单个字符串,并在第一个字符串上使用适当的子字符串处理两个元素的字符串array.另外两个简单的代码在数组和对象上正确重复出现.

请注意,这个版本不会改变你原来的对象(我们不是 brute 人,对吧?),而是返回一个经过修改的克隆.

Javascript相关问答推荐

仅圆角的甜甜圈图表

使用useup时,React-Redux无法找到Redux上下文值

togglePopover()不打开但不关闭原生HTML popover'

从WooCommerce Checkout Country字段重新排序国家,保持国家同步

Spring boot JSON解析错误:意外字符错误

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

用于在路径之间移动图像的查询

第一项杀死下一项,直到数组长度在javascript中等于1

如何使用<;Link>;执行与JS Reaction中的";window.Location=/GameOverDied;";类似的操作?

react -原生向量-图标笔划宽度

如何在独立的Angular 应用程序中添加Lucide-Angel?

使用createBrowserRoutVS BrowserRouter的Reaction路由

在没有任何悬停或其他触发的情况下连续交换图像

谷歌饼图3D切片

递增/递减按钮React.js/Redux

有角粘桌盒阴影

在范围数组中查找公共(包含)范围

react :图表负片区域不同 colored颜色