JavaScript找到"最新"字符串的版本

时间:2018-05-05 17:30:28

标签: javascript string

这可能非常简单,但我不能在这里想到任何好的解决方案:

我有一个字符串数组:

let array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];

随着时间的推移,这个数组会发生变化,但在任何时候我都希望能够将该数组减少到最新的数组。字符串的版本(基于结束数字,它们在某些时候可能变为2位或3位),所以我最终想要的是:

['House3', 'Block2', 'BlockSpecial1']

3 个答案:

答案 0 :(得分:3)

Reduce数组到一个对象,其中字符串为键,版本为值。要获取字符串和版本,您可以使用String.match()array destructuring。然后使用Object.entries()Array.map()将其组合回字符串:



const array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];

const result = Object.entries(array.reduce((r, s) => {
    const [, str, version] = s.match(/([A-Za-z]+)(\d+)/);

    r[str] = (r[str] || 0) > version ? r[str] : version; // or r[str] = version if the versions are always in the right order

    return r;
  }, Object.create(null)))
  .map(([k, v]) => k + v);

console.log(result);




答案 1 :(得分:0)

您可以通过创建Map

来非常干净地完成此操作

const array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];

const re = /^([^]+?)(\d+)$/;
const result = [...new Map(array.map(s => re.exec(s).slice(1)))]
                  .map(a => a.join(""));

console.log(result);

这是破旧......

在原始数组的.map()上,使用正则表达式在文本和数字之间划分每个字符串,并返回仅包含捕获部分的数组。

.map()结果成为Map构造函数的参数。这将创建地图,子数组的每个第一个成员都作为每个键,第二个作为值。

由于Map必须具有唯一键,因此您只能获得为每个冗余键生成的最后一个密钥,该密钥的编号也最高。

然后将该地图转换为剩余的键/值条目,并将它们连接回字符串。

以上是与上面相同的代码,但将其分成几部分,以便我们可以记录每一步。

const array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];

const re = /^([^]+?)(\d+)$/;
const keysVals = array.map(s => re.exec(s).slice(1));

console.log("original split:", keysVals);

const m = new Map(keysVals);
const mapKeysVals = [...m];

console.log("mapped keys vals", mapKeysVals);

const result = mapKeysVals.map(a => a.join(""));

console.log("result", result);

答案 2 :(得分:0)

let tmp, name;
let array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];
let newest = array.sort((a, b) => b.match(/\d+$/)[0] - a.match(/\d+$/)[0]).sort().reverse()
.reduce((newArr, item) => (name = item.match(/.+[^\d]+/)[0], name != tmp && (newArr.push(item), tmp = name), newArr), []);

console.log(newest) //[ 'House3', 'BlockSpecial1', 'Block2' ]