【问题标题】:Sanitizing all string values in a complex object?清理复杂对象中的所有字符串值?
【发布时间】:2017-08-20 18:21:48
【问题描述】:

我有一个 sanitizeStr() 函数,我需要在如下对象中存在的每个属性/子属性上运行它:

const data = {
  info: 'schools',
  schools: [
    { name: 'Johnson Elementary', type: 'elementary' },
    { name: 'Iselin Middle School', type: 'middle' }
  ],
  bestStudent: {
    name: 'John',
    grade: 'sixth'
  }
};

问题在于,对于这些属性中的每一个,它们可能存在也可能不存在。现在,我必须对每个属性进行多次if 检查并手动运行该函数:

// Is there a better way to do this rather than what I have here:

if (data.info) {
  data.info = sanitizeStr(data.info);
}

if (data.bestStudent) {
  if (data.bestStudent.name) {
    data.bestStudent.name = sanitizeStr(data.bestStudent.name);
  }

  if (data.bestStudent.grade) {
    data.bestStudent.grade = sanitizeStr(data.bestStudent.grade);
  }
}

if (data.schools) {
  data.schools.forEach((school, i) => {
    if (school.name) {
      data.schools[i].name = sanitizeStr(school.name);
    }

    if (school.grade) {
      data.schools[i].grade = sanitizeStr(school.grade);
    }
  });
}

如果有人知道这样做的更清洁/更少手动的方式,将不胜感激。

【问题讨论】:

  • sanitizeStr 在做什么?请同时添加该功能。
  • 我没有包含它,因为我认为它不太相关——它只是做了一些字符串替换。我基本上只是想找出一种更好的方法来在每个属性上运行该函数,而不必手动一个一个地执行。
  • @MikeMcCaughan 我知道如何遍历对象的属性。但是,我不能只循环并在循环中的每个道具上运行sanitizeStr,因为该属性可能是字符串、对象或对象数组。
  • 在属性上运行sanitizeStr 之前不能检查类型? typeof stringVar === 'string'...

标签: javascript string sanitization


【解决方案1】:

您可以对对象使用迭代和递归的方法,只为非对象调用函数。

function sanitizeStr(s) {
    return '#' + s;
}

function iterAll(object) {
    Object.keys(object).forEach(function (k) {
        if (object[k] && typeof object[k] === 'object') {
            iterAll(object[k]);
            return;
        }
        object[k] = sanitizeStr(object[k]);
    })
}

var data = { info: 'schools', schools: [{ name: 'Johnson Elementary', type: 'elementary' }, { name: 'Iselin Middle School', type: 'middle' }], bestStudent: { name: 'John', grade: 'sixth' } };

iterAll(data);

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

【讨论】:

  • 您可能需要明确地检查字符串以避免清理数字(从而将它们转换为字符串)。无论如何 +1。
  • 此时在我的代码中,如果属性确实存在,则它们保证是字符串,但这是一个有用的注释,以防其他人看到这一点。非常感谢,我想我可以采用这样的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2014-04-25
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2021-12-14
相关资源
最近更新 更多