如何在对象进行字符串化时从对象中删除引号和反斜杠(不使用正则表达式)

时间:2017-08-21 16:23:42

标签: json node.js regex neo4j

我正在使用Neo4j,它有一个允许一次设置多个属性的子句:

PSPDFKit.showDocumentFromAssets('Layout.pdf', {
        title: 'My PDF Document',
        page: 4,
        scrollDirection: PSPDFKit.PageScrollDirection.VERTICAL,
        scrollMode: PSPDFKit.ScrollMode.CONTINUOUS,
        useImmersiveMode: true
    },success(success){
        console.log('success')
    },fail(fail){
        console.log(fail);
    });

但是,我无法将 MATCH (p:Person) WHERE p.email = '${userEmail}' SET p += ${argsToUpdate} RETURN p AS Person 放入查询中,因为Neo4j正在查找与此处显示的完全相同的字符串:

argsToUpdate

我可以使用 { email: 'test@test.com', age: 1337, colour: 'blue' } 正则表达式和条带\和“但这是次要的,因为某些属性可能包含这些字符。也许它们可以先编码。

我也试过JSON.stringify(argsToUpdate)

我使用JSON.parse(JSON.stringify(argsToUpdate))并且它工作正常,但我的开发人员不会接受它,因为它是node.js调试方法。

是否有一种简单的方法可以实现另一种方式?

我不想做像这样的for循环:

util.inspect(argsToUpdate)

有一种有效的方法吗?问题是 let args = '{ ' for (let i = 0; i < Object.keys(argsToUpdate).length; i++) { args += `${prop[i]}: ${key[i]}` } args += ' }' 包含可变数量的属性。我希望它是动态的,以便代码不那么脆弱。 ES6 +中是否有任何可用的东西,包括可以达到argsToUpdate的结果?

1 个答案:

答案 0 :(得分:1)

假设您正在使用默认的neo4j驱动程序,您应该能够将所有参数传递给标准javascript数据结构中的查询,而不必担心像这样的字符串转义。我认为问题是您的参数名称不正确。

Cypher参数必须由unicode字母组成,不能以货币符号开头。反引号中包含的名称可以包含空格。所以,应该采取如下形式。

  • {someParam}
  • $someParam

甚至可能是下面两个。

{ `some param with spaces in the name` }
$`some param with spaces in the name`

考虑到这一点,下面的查询应该有效。

session
  .run('MATCH (p:Person) WHERE p.email = $userEmail SET p += $argsToUpdate RETURN p AS Person', {userEmail: 'test@test.com', argsToUpdate: { email: 'test@test.com', age: 1337, colour: 'blue' }})