我有以下数组:
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 })
只需使用简单的map
和reduce
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);