使用下划线或 lodash 将一个 JSON 结构转换为另一个
use underscore or lodash convert one JSON structure to another
我在尝试将当前 JSON 结构转换为另一个结构时遇到问题
var data = [
{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
"pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
},
{
"url": "asset/09.flv|asset/10.flv",
"pic": "asset/09.jpg|asset/10.jpg"
}
]
我想将数据转换成这样的输出结构。
这是我想要达到的结果的目标。
var data = [
{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv",
"pic": "asset/04.jpg"
},
{
"url": "asset/05.flv",
"pic": "asset/05.jpg"
},
{
"url": "asset/06.flv",
"pic": "asset/06.jpg"
},
{
"url": "asset/07.flv",
"pic": "asset/07.jpg"
},
{
"url": "asset/08.flv",
"pic": "asset/08.jpg"
},
{
"url": "asset/09.flv",
"pic": "asset/09.jpg"
},
{
"url": "asset/10.flv",
"pic": "asset/10.jpg"
}
]
这对我来说很困难,有人可以帮我解决这个问题吗?我已经试了几个小时了。使用 lodash 或下划线或纯 JS 都可以。提前致谢。
您可以使用 Array#reduce
来完成。这个想法是遍历数组并检查 url
和 pic
的值中是否有 |
。
如果是,拆分值并将所有项目推送到结果。如果没有,请按原样推送 url
和 pic
。
var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
var result = data.reduce((r, {url, pic}) => {
if (url.includes('|') && pic.includes('|')) {
var urls = url.split('|');
var pics = pic.split('|');
urls.forEach((u, i) => {
r.push({url: u, pic: pics[i]});
});
} else {
r.push({url, pic})
}
return r;
}, []);
console.log(result);
您可以使用 Array.reduce
自己进行操作。
const arr = [{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
"pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
},
{
"url": "asset/09.flv|asset/10.flv",
"pic": "asset/09.jpg|asset/10.jpg"
}
];
console.log(arr.reduce((tmp, {
pic,
url,
}) => {
const urlSplit = url.split('|');
return [
...tmp,
...pic.split('|').map((x, xi) => ({
pic: x,
url: urlSplit[xi],
})),
];
}, []));
恕我直言,你可以使用 Array#reduce()
:
做这样的事情
var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
var parsedData = data.reduce((accumulator, e) => {
e['url'].split('|').forEach((ele, i) => {
accumulator.push({"url":ele, "pic": e['pic'].split('|')[i]})
})
return accumulator;
}, [])
console.log(parsedData);
使用 Underscore.js's _.zip()
函数的相同解决方案。
var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
var parsedData = data.reduce((accumulator, e) => {
return accumulator.concat(...(_.zip(e['url'].split('|'), e['pic']
.split('|'))
.map(([url, pic]) => ({url, pic}))))
}, []);
console.log(parsedData)
<script src="https://underscorejs.org/underscore-min.js"></script>
简单地使用 flatmap
和 zipWith
怎么样?
const sortedData = _.flatMap(data, obj =>
_.zipWith(
obj.url.split("|"),
obj.pic.split("|"),
(url, pic) => ({url, pic})
)
);
var data = [
{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
"pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
},
{
"url": "asset/09.flv|asset/10.flv",
"pic": "asset/09.jpg|asset/10.jpg"
}
]
var res = _.flatMap(data, o=>_.zipWith(o.url.split("|"), o.pic.split("|"), (url, pic) => ({url, pic})));
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
我在尝试将当前 JSON 结构转换为另一个结构时遇到问题
var data = [
{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
"pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
},
{
"url": "asset/09.flv|asset/10.flv",
"pic": "asset/09.jpg|asset/10.jpg"
}
]
我想将数据转换成这样的输出结构。
这是我想要达到的结果的目标。
var data = [
{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv",
"pic": "asset/04.jpg"
},
{
"url": "asset/05.flv",
"pic": "asset/05.jpg"
},
{
"url": "asset/06.flv",
"pic": "asset/06.jpg"
},
{
"url": "asset/07.flv",
"pic": "asset/07.jpg"
},
{
"url": "asset/08.flv",
"pic": "asset/08.jpg"
},
{
"url": "asset/09.flv",
"pic": "asset/09.jpg"
},
{
"url": "asset/10.flv",
"pic": "asset/10.jpg"
}
]
这对我来说很困难,有人可以帮我解决这个问题吗?我已经试了几个小时了。使用 lodash 或下划线或纯 JS 都可以。提前致谢。
您可以使用 Array#reduce
来完成。这个想法是遍历数组并检查 url
和 pic
的值中是否有 |
。
如果是,拆分值并将所有项目推送到结果。如果没有,请按原样推送 url
和 pic
。
var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
var result = data.reduce((r, {url, pic}) => {
if (url.includes('|') && pic.includes('|')) {
var urls = url.split('|');
var pics = pic.split('|');
urls.forEach((u, i) => {
r.push({url: u, pic: pics[i]});
});
} else {
r.push({url, pic})
}
return r;
}, []);
console.log(result);
您可以使用 Array.reduce
自己进行操作。
const arr = [{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
"pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
},
{
"url": "asset/09.flv|asset/10.flv",
"pic": "asset/09.jpg|asset/10.jpg"
}
];
console.log(arr.reduce((tmp, {
pic,
url,
}) => {
const urlSplit = url.split('|');
return [
...tmp,
...pic.split('|').map((x, xi) => ({
pic: x,
url: urlSplit[xi],
})),
];
}, []));
恕我直言,你可以使用 Array#reduce()
:
var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
var parsedData = data.reduce((accumulator, e) => {
e['url'].split('|').forEach((ele, i) => {
accumulator.push({"url":ele, "pic": e['pic'].split('|')[i]})
})
return accumulator;
}, [])
console.log(parsedData);
使用 Underscore.js's _.zip()
函数的相同解决方案。
var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
var parsedData = data.reduce((accumulator, e) => {
return accumulator.concat(...(_.zip(e['url'].split('|'), e['pic']
.split('|'))
.map(([url, pic]) => ({url, pic}))))
}, []);
console.log(parsedData)
<script src="https://underscorejs.org/underscore-min.js"></script>
简单地使用 flatmap
和 zipWith
怎么样?
const sortedData = _.flatMap(data, obj =>
_.zipWith(
obj.url.split("|"),
obj.pic.split("|"),
(url, pic) => ({url, pic})
)
);
var data = [
{
"url": "asset/01.flv",
"pic": "asset/01.jpg"
},
{
"url": "asset/02.flv",
"pic": "asset/02.jpg"
},
{
"url": "asset/03.flv",
"pic": "asset/03.jpg"
},
{
"url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
"pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
},
{
"url": "asset/09.flv|asset/10.flv",
"pic": "asset/09.jpg|asset/10.jpg"
}
]
var res = _.flatMap(data, o=>_.zipWith(o.url.split("|"), o.pic.split("|"), (url, pic) => ({url, pic})));
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>