[英]Create an object by flattening an array in his properties
我需要创建一个对象数组,其中每个对象只包含属性数组的一个值。
我会写一个输入和预期结果的例子,因为我认为这个问题很令人困惑,但我真的不知道如何解释它。
数组的第一个元素包含所有属性和数组的第一个值。 第一个元素之后的每个元素都应该有一个唯一的 id 和一个新的属性(例如链接),指的是第一个元素的 id。
输入:
const series = [
{
id: 1,
name: 'game of thrones',
ep: ['01-01-2020','04-03-2020'] // This is the array that will split
},
{
id: 2,
name: 'stranger things',
ep: ['03-02-2020']
}
]
预期产出:
const newSeries = [
{
id: 1, // same id as before
name: 'game of thrones', // same name as before
ep: ['01-01-2020'] // first element of the previous array
},
{
id: 2, // untouched
name: 'stranger things',
ep: ['03-02-2020']
},
{
id: 35, // Any id
ep: ['04-03-2020'] // second element
link: 1 // This is the id of the original element
// name is not necessary
}
// If ep had 3 dates, it would make a new element
]
我不介意对象的顺序。 如果数组中有更多元素,它将继续直到只有一个。
编辑:忘记提交我的尝试:
series.forEach(x => x.ep.map(epdate=>
newarray = [...newarray, {id:'some id', ep: epdate, link: x.id}]
))
我设法拆分了数组,但我错过了识别项目是第一个并且需要保留名称还是在第一个之后并且需要链接的逻辑。 另外,我需要创建一个必须是唯一的随机 ID。
设法让它与此代码一起使用:
serie.forEach(x => {
x.ep.length > 1 ?
x.ep.map(y =>
y === x.ep[0] ?
newarray = [...newarray, {id: x.id, name: x.name, ep: y}] :
newarray = [...newarray, {id: 'id', ep: y, link: x.id}])
:
newarray = [...newarray, {...x, ep: x.ep[0]}]
})
唯一的问题是 id 不是唯一的。 我还建议查看 Calvin 的答案,因为它在代码方面非常清晰和干净。
方法不止一种,但我总是喜欢使用老式的for
循环而不是 ES6 语法(在我看来,为了更好的可读性),但让我们看看:
使用for
循环您的series
数组,检查其ep
以查看长度是否大于 1。
如果是,那么您可以执行以下步骤:
ep
数组放入一个新变量中serie
对象推送到结果数组 ( newSeries
)for
循环ep
数组(从索引 1 开始,因为索引 0 将保留在原始序列中)newSeries
如果没有,那么只需将该serie
对象推送到newSeries
。
const series = [ { id: 1, name: 'game of thrones', ep: ['01-01-2020', '04-03-2020', '01-05-2020']}, { id: 2, name: 'stranger things', ep: ['03-02-2020']} ] let newSeries = []; let idCounter = series.length + 1; for (let i = 0; i < series.length; i++) { let serie = series[i] if (serie.ep.length > 1) { let allEps = serie.ep; serie.ep = [serie.ep[0]] newSeries.push(serie); for (let j = 1; j < allEps.length; j++) { let newSerieObj = {}; newSerieObj.id = idCounter; newSerieObj.ep = [allEps[j]] newSerieObj.link = serie.id; newSeries.push(newSerieObj); idCounter++; } } else { newSeries.push(serie) } } console.log(newSeries)
.as-console-wrapper { min-height: 100% }
注意:我使用变量idCounter
只是为了举例,您可以使用自己的逻辑来设置新的 Id。
如果您希望创建的对象(具有新 id 的对象)始终排在数组的最后,您有两个选择: .sort
by id; 或者不要推送到newSeries
而是推送到另一个数组,并且在所有循环结束后只.concat
这个另一个数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.