Mam następujące tablice: array_order = [ 'SiteA', 'SiteC', 'SiteB'] string_array = [['Site C', 'StringC1_'] , ['Site A', 'StringA1_'], ['.. .

0
redditor 25 czerwiec 2021, 14:21

5 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Array.reduce na string_array, aby zbudować tablicę wyjściową, znajdziemy prawidłowy indeks wyjściowy, uruchamiając Array.findIndex w tablicy wejściowej array_order.

Jeśli nie znajdziemy elementu, pominiemy dodawanie go do wyniku:

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);

I inny sposób na zrobienie tego za pomocą Array.map , Array.filter a> i 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);
1
Terry Lennox 25 czerwiec 2021, 12:02

Jeszcze inny sposób:

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 })
2
Sergio Belevskij 25 czerwiec 2021, 11:46

Wystarczy użyć prostych map i 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);
2
ikhvjs 25 czerwiec 2021, 11:56

Najpierw musisz pogrupować elementy, a następnie możesz zmapować każdą grupę, łącząc ciągi:

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('');
});

Pamiętaj również, że w nazwach grup array_order nie ma spacji: 'Site C' !== 'SiteC'

1
Yuriy Yakym 25 czerwiec 2021, 11:52

Możesz do tego użyć 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);
1
Rajdeep Debnath 25 czerwiec 2021, 11:54