繁体   English   中英

通过在其属性中展平数组来创建对象

[英]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。
如果是,那么您可以执行以下步骤:

  1. ep数组放入一个新变量中
  2. serie对象推送到结果数组 ( newSeries )
  3. 使用另一个for循环ep数组(从索引 1 开始,因为索引 0 将保留在原始序列中)
  4. 在这个循环中,创建一个新对象并设置你想要的属性
  5. 将这个新对象推入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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM