用于从对象中生成字符串的函数

function for making a string out of an object

提问人:Jupiter 提问时间:11/5/2023 最后编辑:Jupiter 更新时间:11/5/2023 访问量:73

问:

我需要制作一个函数,从对象的键/值对生成字符串。 字符串应为 : 。和每个键/值对周围有空格,逗号和空格(最后一个除外)之间有空格。"key = value, key = value"=

所以会.{a: "1'", b: "2"}"a = 1, b = 2"

我正在尝试学习,所以不要直接给我代码,我主要需要知道我错在哪里,并指导我找到正确的答案。 我目前有:

   const obj = {};
const string = [];
string = (string.join( ', ' ));
function stringFromObject(obj){
    for (const [keys, values] of Object.entries(obj)) {
    string.push(`${keys} = ${values}`);
    console.log (string.join( ', ' ));
    
  }
  return string.toString();
}
JavaScript 函数 对象

评论

3赞 mi1000 11/5/2023
为什么要重新分配到函数内部?它只是擦除了您作为参数放置的内容。此外,不要返回字符串,而是返回对象列表。您需要遍历这些值并将每个值连接到您的字符串。{}objkeys()values()
0赞 Bergi 11/5/2023
带有循环的更新代码看起来更好,它包含所有相关部分,但位置错误。移动函数内部,以便每次调用都获得一个新数组。删除和 .使用 instead 而不是返回值。for … ofconst string = []const obj = {};string = (string.join( ', ' ));string.join( ', ' )string.toString()

答:

-4赞 Eric Fortis 11/5/2023 #1

function stringFromObject(obj) {
  return Object.entries(obj)
    .map(([k, v]) => `${k} = ${v}`)
    .join(', ')
}

console.log(stringFromObject({ a: 1, b: 2 }))

评论

3赞 mi1000 11/5/2023
我怀疑这是否在解释任何事情,该解决方案显然是有效的,但初学者不会在没有任何解释的情况下理解这一点
0赞 Javier Rey 11/5/2023
这正是 OP 所要求的。该代码是不言自明的。如果某些部分不理解,可以在 Javascript MDN 文档中找到。: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Object.entriesArray.map
0赞 Bergi 11/5/2023
这是一个很好的解决方案,但缺乏任何解释,并且直接违背了“不要直接给我代码”的要求。它也没有回答有关 OP 当前代码问题的问题。
0赞 Bergi 11/5/2023
@JavierRey 代码执行了 OP 描述的内容,但这不是他们要求的。
0赞 Jupiter 11/5/2023
谢谢你的链接,哈维尔。我不介意为它学习循环 Bergi。任何帮助都是值得赞赏的,我知道有很多不同的方法。
0赞 Bruce 11/5/2023 #2

因为你要求的是指导,而不是直接回答:

一种方法是使用本机函数。 在 JavaScript 中,可以使用静态方法将对象字符串化,就好像它是 JSON 字符串一样。例如,对象字符串化为 {“a”:1,“b”:2}stringifyJSON.stringify(){a: 1, b: 2}

现在您已经掌握了该字符串,您可以在其上使用任意数量的字符串修饰符函数将其格式化为所需的方式。例如,您可以替换为(包括空格),例如:: =

function stringFromObject(obj) {
    let string = JSON.stringify(obj);
    // {"a":1,"b":2}
    string = string.replaceAll(":", " = ");
    // {"a" = 1, "b" = 2}
    //...
}

我想你现在可以弄清楚整个事情了,对吧? 您可以继续更换,直到获得所需的格式。

    string = string.replaceAll(":", " = ").replaceAll("\"", "");
    // {a = 1,b = 2}
    //...

如果您熟悉正则表达式,则可以通过一两个步骤完成整套更改。

另一种方法是遍历键值对。它适用于平面对象(没有嵌套对象),或者您需要递归遍历它们。考虑到本机功能提供的速度和便利性,对于大型嵌套对象,这将有点痛苦和不必要的慢速。

解决方案的主要问题是将传入的对象替换为空对象,因此不会打印任何内容,因为没有要打印的内容。另一个问题是,即使有一个键显示它将是一个成员的数组,每个都返回一个数组(而不是字符串),因此您应该获取数组成员。最后,即使您解决了这些问题,当前函数也仅适用于一对(除非您从另一个循环中调用此函数)。Object.keysObject.values

评论

0赞 Bergi 11/5/2023
不,不要使用奇怪的字符串替换规则来创建自定义序列化。OP 真的应该使用(并学习)循环。我也怀疑是否有任何显着的性能差异。JSON.stringify
0赞 Bruce 11/5/2023
我仔细考虑了一下我的答案,并坦率地选择了方法的顺序。我也提到过这是一种方式,但是一个非常早期的初学者如何检测并递归循环嵌套对象等?我考虑了他/她重新分配了 obj 的事实,并且在做出排序决定之前,他/她在字符串中添加了一个数组。我的答案没有错,也不应该仅仅因为你更喜欢其他更好的方式而得到否定!
0赞 Bergi 11/5/2023
我怀疑他们需要处理嵌套对象。但是,是的,练习的目标是学习循环,他们需要先理解循环,然后才能理解什么或做什么。正则表达式方法绝对不适合初学者 - 但需要对 json 文本进行大量替换才能获得所需的输出。而且“继续进行更多的字符串替换,直到它看起来正确”真的是糟糕的建议,imo,它不是一种可行的算法方法,不应该教/展示给初学者。JSON.stringifyreplaceAll
0赞 Jupiter 11/5/2023
谢谢,这将是我第一次使用 JSON.stringify,我在更改我询问的代码之前尝试过,但我一定是格式错误。我是初学者,但我经常使用循环,我正在做的项目里面有 14 个函数。我还剩下 4 个,但所有其他的我都使用了循环。
0赞 Alexander Nenashev 11/5/2023 #3

您可以在没有中间数组的情况下连接字符串,这样会快得多。您也可以添加递归来转储嵌套对象:

 const obj = {a: "1", b: "2", c: {d: "3", e: "4" }};
 
 const dumpObj = (obj, out = '') => {
    for(const [k, v] of Object.entries(obj)){
        out += (out ? ', ' : '')  + (typeof v === 'object' ? `${k} = {${dumpObj(v)}}` : `${k} = ${v}`);
    }
    return out;  
 };
 
 console.log(dumpObj(obj));