我有一个像这样的json:
{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"}]}}
...,然后动态获取值并创建一个变量:
var existingParams = [
"name",
"updated"].filter(field => getBody.search[field]);
var sqlVal = existingParams.map(field => {
if (field === 'name') {
function getValues(item, index) {
var getVal = [item.tag];
return "%" + getVal + "%";
}
console.log(name.map(getValues));
return name.map(getValues);
} else {
return getBody.search[field];
}
})
对于上面的示例,我得到了sqlVal:
console.log(sqlVal);
[ [ '%Peter%' ], '2018-11-07' ]
...很好。
但是,如果我有两个值:
{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"}]}}
...我正在得到这个结构:
[ [ '%Peter%', '%Jack%' ], '2018-11-07' ]
...但是我需要的是……
[ '%Peter%', '%Jack%', '2018-11-07' ]
...或:
[ ['%Peter%'], ['%Jack%'], '2018-11-07' ]
还有进一步的情况3个名字:
{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"},{"tag":"Maria"}]}}
...我需要……
[ '%Peter%', '%Jack%', '%Maria%', '2018-11-07' ]
...或:
[ ['%Peter%'], ['%Jack%'], ['%Maria%'], '2018-11-07' ]
...等等
我需要如何调整上面的查询来获取此信息?
答案 0 :(得分:4)
如果我正确理解了您的问题,则可以通过Array#reduce()
方法解决此问题。
此方法的总体思路是将输入对象转换为数组-使用减少操作name
上的嵌套值的特殊情况规则,可以使用reduce操作来完成此操作进入最终结果:
var input = {"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"}]}}
var result = Object
.entries(input.search)
.reduce(function(result, entry) {
const key = entry[0]
const value = entry[1]
if(key === 'name') {
// When the 'name' key is encountered, handle the value
// differently, by addting the items of this value array
// to the result
value.forEach(function(item) {
result.push('%' + item.tag + '%')
})
}
else {
// Append values for other keys directly to the result
result.push(value)
}
return result
}, [])
console.log(result )
答案 1 :(得分:1)
您可以简单地使用Object.values + reduce这样的内容:
const json = { "search": { "updated": "2018-11-07", "name": [{ "tag": "Peter" }, { "tag": "Jack" }, { "tag": "Maria" }] } }
const result = Object.values(json.search).reduce((r,c) =>
(Array.isArray(c) ? r.push(...c.map(({tag}) => `%${tag}%`)) : r.push(c), r),[])
console.log(result)
如果顺序很重要(首先是姓名,然后是日期),则可以使用reverse:
const json = { "search": { "updated": "2018-11-07", "name": [{ "tag": "Peter" }, { "tag": "Jack" }, { "tag": "Maria" }] } }
const result = Object.values(json.search).reverse().reduce((r,c) =>
(Array.isArray(c) ? r.push(...c.map(({tag}) => `%${tag}%`)) : r.push(c), r),[])
console.log(result)
答案 2 :(得分:1)
首先,您没有提供Minimal, Complete, and Verifiable example,因此,我很难弄清您遇到了什么问题。例如,您引用的是existingParam
,但它们的定义都没有。这是理解问题的关键,因为您发布的所有代码都大量投入了该值的值和格式。
第二,您如何解析JSON?使用标准的JSON#parse
函数,您将获得与提供的JSON具有相同结构的对象。但是,您要么不使用它,要么在将对象解析为新格式后对其进行突变。无论哪种方式,JSON#parse
为提供的JSON返回的对象都不是数组,因此您不能在其上使用Array#map
。
为了提高工作效率,我将尝试解释如何做事情。
JSON:
let data1 = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"}]}}',
data2 = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"}]}} ',
data3 = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"},{"tag":"Maria"}]}}';
现在我们有了JSON数据,我们需要对其进行解析并将其存储为JSON对象。为此,我将创建一个函数;这样,可以将数据传递到相同的函数并以相同的方式处理,但是实现将保持不变。另外,由于我们仅查看search
属性中的值,因此我们将继续并直接进入其中。
解析JSON:
function parseResponse (response) {
let parsedResponse = JSON.parse(response);
parsedResponse = parsedResponse['search'];
}
现在,我们有了可以响应并进行解析的函数,然后我们就可以开始对其进行排序,以查找和隔离所需的部分。在这种情况下,我们将添加一些代码以遍历属性,并找到updated
和name
属性。
function parseResponse (response) {
let parsedResponse = JSON.parse(response);
parsedResponse = parsedResponse['search'];
for (let prop in parsedResponse) {
if (prop === 'updated') {
// do stuff with 'updated'
}
if (prop === 'name') {
// do stuff with 'name'
}
}
}
因为我们要返回结果,所以我们将添加变量updated
和names
,这些变量将保存我们从字符串中拉出的值,直到准备好返回它们为止。现在我们有了循环和临时变量,接下来可以将更新后的值从数据中提取出来并将其放在updated
变量中。
function parseResponse (response) {
let parsedResponse = JSON.parse(response),
updated = '',
names = [];
parsedResponse = parsedResponse['search'];
for (let prop in parsedResponse) {
if (prop === 'updated') {
updated = parsedResponse[prop];
}
if (prop === 'name') {
// do stuff with 'name'
}
}
}
我们将updated
的值平方掉,就可以进入我们的名字了。由于您首先列出了['%name%', '%name%', '%name%']
格式,因此我将继续向您展示如何使用这种格式。在这里,我们将获取属性name
,遍历名称,获取tag
属性,然后添加%
s,然后将其推入names
临时变量
function parseResponse (response) {
let parsedResponse = JSON.parse(response),
updated = '',
names = [];
parsedResponse = parsedResponse['search'];
for (let prop in parsedResponse) {
if (prop === 'updated') {
updated = parsedResponse[prop];
}
if (prop === 'name') {
for (let i = 0; i < parsedResponse[prop].length; i++) {
let name = parsedResponse[prop][i].tag;
name = '%' + name + '%';
names.push(name);
}
}
}
}
一切就绪后,剩下的就是组装结果。为此,我们将展平names
的数组,将它们添加到数组中,然后在返回之前将updated
值添加到末尾。为了使数组变平,我们将使用spread
运算符。
function parseResponse (response) {
let parsedResponse = JSON.parse(response),
updated = '',
names = [];
parsedResponse = parsedResponse['search'];
for (let prop in parsedResponse) {
if (prop === 'updated') {
updated = parsedResponse[prop];
}
if (prop === 'name') {
for (let i = 0; i < parsedResponse[prop].length; i++) {
let name = parsedResponse[prop][i].tag;
name = '%' + name + '%';
names.push(name);
}
}
}
return [...names, updated];
}
在所有这些设置之后,我们可以继续使用parseResponse()
,data1
或data2
呼叫data3
,并返回如下响应:>
let data1 = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"}]}}',
data2 = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"}]}} ',
data3 = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"},{"tag":"Maria"}]}}';
function parseResponse (response) {
let parsedResponse = JSON.parse(response),
updated = '',
names = [];
parsedResponse = parsedResponse['search'];
for (let prop in parsedResponse) {
if (prop === 'updated') {
updated = parsedResponse[prop];
}
if (prop === 'name') {
for (let i = 0; i < parsedResponse[prop].length; i++) {
let name = parsedResponse[prop][i].tag;
name = '%' + name + '%';
names.push(name);
}
}
}
return [...names, updated];
}
console.log(parseResponse(data1));
console.log(parseResponse(data2));
console.log(parseResponse(data3));
答案 3 :(得分:1)
Spread运算符可用于将结果展平:
var obj = {"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"},{"tag":"Maria"}]}}
var arr = [...obj.search.name.map(n => `%${n.tag}%`), obj.search.updated]
console.log( arr )
另一种选择是在解析过程中提取:
var arr = [], json = '{"search":{"updated":"2018-11-07","name":[{"tag":"Peter"},{"tag":"Jack"},{"tag":"Maria"}]}}'
JSON.parse(json, (k, v) => v.trim && arr.push(k === 'tag' ? `%${v}%` : v))
console.log( arr )