这可能非常简单,但我不能在这里想到任何好的解决方案:
我有一个字符串数组:
let array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];
随着时间的推移,这个数组会发生变化,但在任何时候我都希望能够将该数组减少到最新的数组。字符串的版本(基于结束数字,它们在某些时候可能变为2位或3位),所以我最终想要的是:
['House3', 'Block2', 'BlockSpecial1']
答案 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' ]