gpt4 book ai didi

javascript - 替换对象(和/或数组)中字符串的所有实例 - JavaScript

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:54 25 4
gpt4 key购买 nike

搜索未知深度和属性的 JavaScript 对象并替换给定字符串的所有实例的最佳方法是什么?

这可行,但这是最好的方法吗?

var obj = {
'a' : 'The fooman poured the drinks.',
'b' : {
'c' : 'Dogs say fook, but what does the fox say?'
}
}

console.log (JSON.parse(JSON.stringify(obj).replace(/foo/g, 'bar')));

fiddle :http://jsfiddle.net/93Uf4/3/

最佳答案

除了您自己提出的方法之外,还有一个经典的循环方法。正如有人在评论中提到的那样,它更稳定,因为您不会冒险搞砸对象并在尝试解析它时抛出错误。另一方面,出现了一些问题(见底部)。

不过要小心,因为 needle 将用作正则表达式。您可能需要考虑添加某种 quoting

我希望我没有遗漏任何东西,所以测试它并尝试一下。在这里你可以找到一个 fiddle .

/**
* Replaces all occurrences of needle (interpreted as a regular expression with replacement and returns the new object.
*
* @param entity The object on which the replacements should be applied to
* @param needle The search phrase (as a regular expression)
* @param replacement Replacement value
* @param affectsKeys[optional=true] Whether keys should be replaced
* @param affectsValues[optional=true] Whether values should be replaced
*/
Object.replaceAll = function (entity, needle, replacement, affectsKeys, affectsValues) {
affectsKeys = typeof affectsKeys === "undefined" ? true : affectsKeys;
affectsValues = typeof affectsValues === "undefined" ? true : affectsValues;

var newEntity = {},
regExp = new RegExp( needle, 'g' );
for( var property in entity ) {
if( !entity.hasOwnProperty( property ) ) {
continue;
}

var value = entity[property],
newProperty = property;

if( affectsKeys ) {
newProperty = property.replace( regExp, replacement );
}

if( affectsValues ) {
if( typeof value === "object" ) {
value = Object.replaceAll( value, needle, replacement, affectsKeys, affectsValues );
} else if( typeof value === "string" ) {
value = value.replace( regExp, replacement );
}
}

newEntity[newProperty] = value;
}

return newEntity;
};

最后两个参数是可选的,所以可以这样调用它:

var replaced = Object.replaceAll( { fooman: "The dog is fooking" }, "foo", "bar" );

但是,仍然存在不清楚应该发生什么的边缘情况。例如:

// do you expect it to stay undefined or change type and become "undebazed"?
console.log( Object.replaceAll( { x: undefined }, "fin", "baz" ) );

// null or "nalala"?
console.log( Object.replaceAll( { x: null }, "ull", "alala" ) );

或者

// true or false?
console.log( Object.replaceAll( { x: true }, "true", "false" ) );

// true or "foo"?
console.log( Object.replaceAll( { x: true }, "true", "foo" ) );

数字也是如此

// 1337 or 1007?
console.log( Object.replaceAll( { x: 1337 }, "33", "00" ) );

// 1337 or "1foo7"
console.log( Object.replaceAll( { x: 1337 }, "33", "foo" ) );

我的方法目前没有处理这些情况——只有对象(用于嵌套)和字符串会被触及。

关于javascript - 替换对象(和/或数组)中字符串的所有实例 - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com