javascript - 使用递归函数 trim 字段无法按预期工作

标签 javascript lodash

我试图在提交之前 trim 表单的字段,但由于某种原因,这些值保持不变。递归函数定义为:

const trimFields = form => _.forIn(form, element => isObject(element) ? trimFields(element) : trimText(element))

但这根本不起作用,它似乎只是保留了原始值。

我在这里做错了什么?

Fiddle

最佳答案

您的递归函数实际上从未修改表单或返回有用的内容。当您遇到带有字符串(或非对象)的值时,您需要修改对象的键。如果你遇到一个对象的值,你可以再次调用你的函数来 trim 它的值。

const trimFields = form => _.forIn(form, (element, k) => {
  if(_.isObject(element)) {
    trimFields(element)
  } else {
    form[k] = _.trim(element); // set the object's key to be the trimmed version of its element
  } 
});

trimFields(form);
// set the values of the elements... 

不过,上述内容不需要 lodash 方法,您可以使用标准的内置结构来执行您想要的操作。

话虽如此,我建议您使用 _.mapValues()生成一个新的表单对象,而不是修改当前的表单对象。这是通过返回对象应采用的新值来实现的。如果 element 是一个对象,您可以在其上递归地重新运行函数以映射 element 的对象。如果不是对象,可以使用lodash的_.trim()方法返回当前对象值的 trim 值。

const trimFields = form => _.mapValues(form, 
  element => _.isObject(element) ? trimFields(element) : _.trim(element)
);

参见下面的示例:

const form = {name: '   John Doe   ', email: 'john@doe.com', handle: 'jdoe', social: { facebook: '    John Doe\'s page', twitter: '@jdoe'}};

const trimFields = form => _.mapValues(form, 
  element => _.isObject(element) ? trimFields(element) : _.trim(element)
);

const new_form = trimFields(form);
document.getElementById('name').value = new_form.name;
document.getElementById('email').value = new_form.email;
document.getElementById('handle').value = new_form.handle;
document.getElementById('facebook').value = new_form.social.facebook;
document.getElementById('twitter').value = new_form.social.twitter;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
<div style="display: flex; flex-direction: column">
  <input type="text" id="name" />
  <input type="email" id="email" />
  <input type="text" id="handle" />
  <input type="text" id="facebook" />
  <input type="text" id="twitter" />
</div>

关于javascript - 使用递归函数 trim 字段无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61008071/

相关文章:

javascript - js中可以获取到之前的历史状态对象吗?

javascript - 我需要帮助组合或翻译 c 和 JS

javascript - Javascript 对象中的嵌套键值对

javascript - 将映射加载到不同的变量名称

javascript - 使用 lodash updatePosition 不起作用

javascript - 去抖动和 react 窗口调整这个引用问题

javascript - 键入时根据输入字段动态更改选择选项

javascript - jquery 上的链接行为有问题,e.preventDefault 不起作用?

javascript - 创建条件 if/else 语句以显示最终测验分数结果