如何解决在JavaScript上对数组元素进行排序
我有一个数组,每个子数组都包含以不同顺序排列的不同位置:
[
["apple(2)","banana(5)"],["peach(3)","banana(1)"],["apple(1)"]
]
我需要在JavaScript(ES6)上对其进行排序,并且我希望得到这样的数组:
[
["apple(2)","banana(5)","peach(0)"],["apple(0)","banana(1)","peach(3)"],["apple(1)","banana(0)","peach(0)"]
]
每个子数组的顺序应该相同。如果子数组没有位置,我需要添加0
值。我可以使用类似map()
或sort()
的功能还是需要手动比较它?
解决方法
首先获得唯一的单词。然后遍历数组以检查单词是否存在。如果不存在,则根据您的条件进行单词处理;如果存在,则将原始单词放入tmp数组。最后,对每个迭代进行排序。顺便说一句,我使用正则表达式替换方法来获得单词。
const data = [
['apple(2)','banana(5)'],['peach(3)','banana(1)'],['apple(1)'],];
const words = [...new Set(data.flat().map((x) => x.replace(/[^a-z]/gi,'')))];
const ret = data.map((x) => {
const tmp = [];
const newX = x.map((y) => y.replace(/[^a-z]/gi,''));
for (let i = 0,l = words.length; i < l; i += 1) {
if (newX.includes(words[i])) tmp.push(x.shift());
else tmp.push(`${words[i]}(0)`);
}
return tmp.sort();
});
console.log(ret);
,
您必须循环获取使用的密钥。然后,您必须循环第二遍以填写丢失的键。有很多方法可以做到这一点。
var data = [
["apple(2)","banana(5)"],["peach(3)","banana(1)"],["apple(1)"]
];
// match string and number
var re = /([^(]+)\((\d+)\)/;
// Loop over and find all of the keys
var grouped = data.reduce((info,subset,index) => {
subset.forEach(item => {
// find the key and count
var parts = item.match(re);
// have we seen this key?
if (!info[parts[1]]) {
// if not create an array
info[parts[1]] = Array(data.length).fill(0);
}
// set the key index with the count
info[parts[1]][index] = parts[2];
})
return info;
},{});
// loop over the groups and fill in the set
Object.entries(grouped).forEach(([key,counts],colIndex) => {
counts
.forEach((cnt,rowIndex) => {
data[rowIndex][colIndex] = `${key}(${cnt})`;
})
});
console.log(data);
,
这里是使用Map
和reduce
的函数式编程方法:
const data = [['apple(2)',];
// Create a Map with default values for each name,i.e. with "(0)":
let names = new Map(data.flat().map(item => [item.replace(/\d+/,""),item.replace(/\d+/,"0")]));
let result = data.map(row =>
[...row.reduce((map,item) =>
map.set(item.replace(/\d+/,item),// Overwrite default
new Map(names) // Start with clone of original Map
).values()]
);
console.log(result);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。