用1d数组对2d数组进行分组和连接



我有以下数组:

array_order = [ 'SiteA', 'SiteC', 'SiteB' ]
string_array = [
[ 'Site C', 'StringC1_' ] ,
[ 'Site A', 'StringA1_' ] ,
[ 'Site C', 'StringC2_' ] ,
[ 'Site B', 'StringB1_' ] ,
[ 'Site B', 'StringB2_' ] ,
[ 'Site B', 'StringC3_' ] ,
[ 'Site B', 'StringA2_' ]
]

我想按站点对字符串进行分组,并将它们按array_order的顺序输出为串联字符串,因此如下所示:

output = [ 'StringA1_StringA2_', 'StringC1_StringC2_StringC3_', 'StringB1_StringB2_' ]

串联顺序无关紧要,例如"StringA1StringA2"one_answers"StringA2StringA1"一样好,所以我不需要担心对它们进行排序。

我最初认为我可以将string_array转换为一个对象,然后以某种方式按组连接,然后像array_order.map(key => obj[key])一样映射它,但我正在努力制作一个要迭代和连接的对象。

另一种方式:

const siteOrder = ['Site A', 'Site C', 'Site B']
const strings = [
['Site C', 'StringC1_'],
['Site A', 'StringA1_'],
['Site C', 'StringC2_'],
['Site B', 'StringB1_'],
['Site B', 'StringB2_'],
['Site B', 'StringC3_'],
['Site B', 'StringA2_'],
]
const result = siteOrder.reduce((acc, site) => {
acc[site] = ''
return acc
}, {})
strings.forEach((siteString) => {
const [site, string] = siteString
result[site] += string
})
console.log({ result })

只需使用简单的mapreduce

array = ["Site A", "Site C", "Site B", "Site X"];
data = [
["Site C", "StringC1_"],
["Site A", "StringA1_"],
["Site C", "StringC2_"],
["Site B", "StringB1_"],
["Site B", "StringB2_"],
["Site B", "StringB3_"],
["Site B", "StringB4_"],
];
const output = array.map(e =>
data.reduce((a, b) => (a += b[0] === e ? b[1] : ""), "")
);
console.log(output);

您可以在string_array上使用Array.reduce来构建输出数组,我们将在array_order输入数组上运行Array.findIndex来找到正确的输出索引。

如果我们找不到项目,我们将跳过将其添加到输出:

array_order = [ 'SiteA', 'SiteX', 'SiteC', 'SiteB']
string_array = [
[ 'SiteC', 'StringC1_' ] ,
[ 'SiteA', 'StringA1_' ] ,
[ 'SiteC', 'StringC2_' ] ,
[ 'SiteB', 'StringB1_' ] ,
[ 'SiteB', 'StringB2_' ] ,
[ 'SiteC', 'StringC3_' ] ,
[ 'SiteA', 'StringA2_' ]
]

let result = string_array.reduce((acc, [site, value], arr) => { 
let index = array_order.findIndex(el => el === site);
if (index >= 0) { 
acc[index] = (acc[index] || "") + value;
}
return acc;
}, array_order.map(el => ""))


console.log('Result:', result);

使用Array.map、Array.filter和Array.join的另一种方法是:

array_order = [ 'SiteA', 'SiteX', 'SiteC', 'SiteB']
string_array = [
[ 'SiteC', 'StringC1_' ] ,
[ 'SiteA', 'StringA1_' ] ,
[ 'SiteC', 'StringC2_' ] ,
[ 'SiteB', 'StringB1_' ] ,
[ 'SiteB', 'StringB2_' ] ,
[ 'SiteC', 'StringC3_' ] ,
[ 'SiteA', 'StringA2_' ]
]

let result = array_order
.map(el => string_array.filter(([site, val]) => site === el)
.map(([site, val]) => val)
.join(""));

console.log("Result:",result);

首先需要对项目进行分组,然后可以映射每个串联字符串的组:

const grouped_arrays = string_array.reduce((result, entry) => {
const [groupName, value] = entry;
result[groupName] = result[groupName] || [];
result[groupName].push(value);
return result;
}, {});
const result = array_order.map(groupName => {
return (grouped_arrays[groupName] || []).join('');
});

请注意,您的array_order组名没有空格:'Site C' !== 'SiteC'

您可以将reduce用于此

array_order = [ 'Site A', 'Site C', 'Site B' ]
string_array = [
[ 'Site C', 'StringC1_' ] ,
[ 'Site A', 'StringA1_' ] ,
[ 'Site C', 'StringC2_' ] ,
[ 'Site B', 'StringB1_' ] ,
[ 'Site B', 'StringB2_' ] ,
[ 'Site B', 'StringC3_' ] ,
[ 'Site B', 'StringA2_' ]
]

let result = [...string_array.reduce((acc,[k,v]) => {
acc.has(k)? acc.set(k, acc.get(k)+v) : acc.set(k,v);
return acc;
}
, new Map())]
.sort((a,b) => array_order.indexOf(a[0])-array_order.indexOf(b[0]))
.map(i => i[1])
console.log(result);

最新更新