首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将线性数组的元素组合起来?

如何将线性数组的元素组合起来?
EN

Stack Overflow用户
提问于 2018-10-19 16:37:07
回答 6查看 67关注 0票数 0

我的数据看起来是:

代码语言:javascript
复制
[ [ '0s', '0.200s' ],
  [ '0.200s', '0.600s' ],
  [ '1.600s', '2.500s' ],
  [ '3.500s', '3.900s' ],
  [ '3.900s', '4.400s' ],
  [ '4.400s', '4.600s' ],
  [ '4.600s', '4.700s' ],
  [ '4.700s', '5.200s' ],
  [ '5.200s', '5.400s' ],
  [ '5.400s', '5.800s' ],
  [ '5.800s', '6.100s' ],
  [ '6.100s', '6.800s' ],
  [ '6.800s', '7s' ],
  [ '7s', '7.300s' ],
  [ '7.300s', '7.500s' ]
]

第一个元素结束于0.200s,这是第二个元素开始的地方。所以我希望这两个组合成为['0s', '0.600s']

下一个元素不是从这个元素结束的位置开始的,所以它应该继续。最终的结果应该是:

代码语言:javascript
复制
[ [ '0s', '0.600s' ],
  [ '1.600s', '2.500s' ],
  [ '3.500s', '7.500s' ]
]

我试图递归地做这件事,但是它会产生错误。这是我的功能:

代码语言:javascript
复制
function combineStartsEnds(timecodes) {
  if (timecodes[0][1] === timecodes[1][0]) {
    let combined = [
      [timecodes[0][0], timecodes[1][1]]
    ].concat(_.slice(timecodes, 2));

    return combineStartsEnds(combined);
  } else {
    return timecodes[0].concat(combineStartsEnds(_.slice(timecodes, 1)));
  }
};

这就产生了一个错误:

代码语言:javascript
复制
TypeError: Cannot read property '0' of undefined

对如何做到这一点有什么想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-10-19 16:42:36

您在这里缺少括号,这是:

代码语言:javascript
复制
 return timecodes[0].concat(...)

必须:

代码语言:javascript
复制
 return [timecodes[0]].concat(...)

此外,还需要一个基本大小写来结束递归:

代码语言:javascript
复制
 function combineStartsEnds(timecodes) {
   if(!timecodes.length) return [];

我会怎么做:

代码语言:javascript
复制
 function combineStartsEnds(timecodes) {
   const result = []; let previous = [];
   for(const [start, end] of timecodes) {
     if(start === previous[/*end*/ 1]) {
       previous[/*end*/ 1] = end;
     } else {
       result.push(previous = [start, end]);
    }
  }
  return result;
 }
票数 4
EN

Stack Overflow用户

发布于 2018-10-19 16:57:04

您也可以使用reduce来完成这一任务。

代码语言:javascript
复制
const times = [ [ '0s', '0.200s' ],
  [ '0.200s', '0.600s' ],
  [ '1.600s', '2.500s' ],
  [ '3.500s', '3.900s' ],
  [ '3.900s', '4.400s' ],
  [ '4.400s', '4.600s' ],
  [ '4.600s', '4.700s' ],
  [ '4.700s', '5.200s' ],
  [ '5.200s', '5.400s' ],
  [ '5.400s', '5.800s' ],
  [ '5.800s', '6.100s' ],
  [ '6.100s', '6.800s' ],
  [ '6.800s', '7s' ],
  [ '7s', '7.300s' ],
  [ '7.300s', '7.500s' ]
];

const merged = times.reduce((acc, [t3, t4]) => {
  const [t1, t2] = acc[acc.length - 1] || [null, null];
  if (t2 === t3) {
    acc.pop();
    acc.push([t1, t4]);
  } else {
    acc.push([t3, t4]);
  }
  return acc;
}, []);

console.log(merged);

票数 1
EN

Stack Overflow用户

发布于 2018-10-19 17:29:24

您也可以尝试下面的方法来获得您想要的结果。

(1)使数组变平,您将得到

代码语言:javascript
复制
arr.flat()

["0s", "0.200s", "0.200s", "0.600s", "1.600s", "2.500s", "3.500s", "3.900s", "3.900s", "4.400s", "4.400s", "4.600s", "4.600s", "4.700s", "4.700s", "5.200s", "5.200s", "5.400s", "5.400s", "5.800s", "5.800s", "6.100s", "6.100s", "6.800s", "6.800s", "7s", "7s", "7.300s", "7.300s", "7.500s"]

(2)过滤和删除元素,如果在其位置之前和之后存在相同的元素,则将得到

代码语言:javascript
复制
arr.flat().filter((d,i,c) => d != c[i-1] && d != c[i+1])

["0s", "0.600s", "1.600s", "2.500s", "3.500s", "7.500s"]

(3)将上述结果降至所需的格式

代码语言:javascript
复制
arr.flat()
    .filter((d,i,c) => d != c[i-1] && d != c[i+1])
    .reduce((res, d, i, c) => (i%2 == 0 && res.push([d, c[i+1]]) , res) , [])

[["0s", "0.600s"]
["1.600s", "2.500s"]
["3.500s", "7.500s"]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52896598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档