如何将第一个数组中的首字母转换为与第二个数组中的值匹配

3

我有两个数组:

array1 = ['bob', 's', 'paul'];
array2 = ['bob', 'sue', 'paul'];

我想将数组1中的首字母's'转换为数组2中相应的名称'sue'。

同时,我希望这也可以实现反向转换,即:

array1 = ['bob', 'sue', 'paul'];
array2 = ['bob', 's', 'paul'];

这样在array1中的'sue'将会转换为与array2匹配的's'。

到目前为止,我有以下函数:

function findName(arr1, arr2) {
        for (let initial of arr1) {
            if (initial.length === 1) {
                return arr2.findIndex(name => name[0] === initial) != -1
            }
        }
    }

如果初始值匹配,则该函数将返回 true,但我需要该函数实际创建 array3,以便它将转换初始值。
换句话说:
array1 = ['bob', 's', 'paul'];
array2 = ['bob', 'sue', 'paul'];
// array3 = ['bob', 'sue', 'paul']; //array 3 maintains the same sequence order as array 1

array1 = ['b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob'];
// array3 = ['bob', 's', 'paul']; //array 3 maintains the same sequence order as array 1

array1 = ['b', 'sue', 'paul', 'robert'];
array2 = ['s', 'paul', 'bob'];
// array3 = ['bob', 's', 'paul', 'robert']; //array 3 maintains the same sequence order as array 1

array1 = ['b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob', 'robert'];
// array3 = ['bob', 's', 'paul']; //array 3 maintains the same sequence order as array 1

在存在多个相同的首字母时,只需转换第一个字母并保留第二个字母:
array1 = ['b', 'b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob', 'robert'];
// array3 = ['bob', 'b', 's', 'paul']; //array 3 maintains the same sequence order as array 1

除非缩写找到匹配的集合,否则按顺序转换它们:
array1 = ['b', 'b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob', 'robert', 'bill'];
// array3 = ['bob', 'bill', 's', 'paul']; //array 3 maintains the same sequence order as array 1

我需要能够在此函数外部使用array3。

使用 return arr1.map(…) 吗? - Bergi
5个回答

1

将第一个数组中的缩写转换为与第二个数组中的值匹配

let array1 = ['b', 'b', 'sue', 'paul'];
let array2 = ['s', 'paul', 'bob', 'robert', 'bill'];
let array3 = [];
array1.forEach(function(element) {
  let item =array2.find((el) => el.startsWith(element[0]));
  array3.push(item);
  var index = array2.indexOf(item);
  if (index > -1) {
    array2.splice(index, 1);
  }
});
 console.log(array3);


你应该避免重复调用 array2.find((el) => el.startsWith(element[0])) - adiga

0

你已经在使用findIndex来定位元素在数组中的位置;因此,不要将其丢弃并仅返回一个布尔值来告诉是否为-1,而是使用它来索引数组(如果当然不是-1)。

i = arr2.findIndex(...);
result = (i > -1)? arr2[i] : initial;

0
你可以使用 map 遍历第一个数组,并像这样使用 findIndexsplice

function getArray3(array1, array2) {
  let array3 = array1.map(a => {
      let found;
      if (a.length === 1) {
        found = array2.findIndex(b => b.startsWith(a))
      } else {
        found = array2.findIndex(b => b.length === 1 && a.startsWith(b))
      }

      return found === -1 ? a : array2.splice(found, 1)[0]
    })

  return array3
}

console.log(getArray3(['bob', 's', 'paul'], ['bob', 'sue', 'paul']))
// ['bob', 'sue', 'paul']; 

console.log(getArray3(['b', 'sue', 'paul'], ['s', 'paul', 'bob']))
// ['bob', 's', 'paul']; //array 3 maintains the same sequence order as array 1

console.log(getArray3(['b', 'sue', 'paul', 'robert'], ['s', 'paul', 'bob']))
// ['bob', 's', 'paul', 'robert']

console.log(getArray3(['b', 'b', 'sue', 'paul'], ['s', 'paul', 'bob', 'robert']))
// ['bob', 'b', 's', 'paul']

console.log(getArray3(['b', 'b', 'sue', 'paul'], ['s', 'paul', 'bob', 'robert', 'bill']))
// ['bob', 'bill', 's', 'paul']

如果你不想改变 `array2`,你可以使用 `[...array2]` 来克隆 `array2`。

0

你可以使用 map 和 find 函数

这里的思路是 -

  • 首先我们循环遍历参数 A
  • 对于每个 A 的值,我们将其与参数 B 中的初始值进行匹配。alreadyUsed 是一个对象,用于跟踪先前使用的替换。
  • 如果我们找到一个非假值且未用于任何先前的替换的值,则将其映射到最终输出。否则,我们保持值不变

let switcher = (A,B)=>{
  let alreadyUsed = {}
  return A.map(e => {
    let value = B.find(b => b.startsWith( e[0] ) && !alreadyUsed[b] ) || e
    if(value && !alreadyUsed[value] ){
      alreadyUsed[value] = true
    }
    return value
  })
}


let array1 = ['bob', 's', 'paul'];
let array2 = ['bob', 'sue', 'paul'];

console.log(switcher(array1,array2))

let a1 = ['b', 'b', 'sue', 'paul'];
let a2 = ['s', 'paul', 'bob', 'robert', 'bill'];
console.log(switcher(a1,a2))


0

这里有一个结合了mapfindIndex的解决方案:

const mapInitials = (a1, a2) => {
  a2 = [...a2]; // clone because we're going to be modifying this one
  return a1.map((s1) => {
    const i = a2.findIndex(s2 => s2[0] === s1[0]);
    return i < 0 ? s1 : a2.splice(i, 1)[0];
  })
};

const test = (a1, a2) => console.log(...mapInitials(a1, a2));

test(['bob', 's', 'paul'],
     ['bob', 'sue', 'paul']);
  // ['bob', 'sue', 'paul']

test(['b', 'sue', 'paul'],
     ['s', 'paul', 'bob']);
  // ['bob', 's', 'paul']

test(['b', 'sue', 'paul', 'robert'],
     ['s', 'paul', 'bob']);
  // ['bob', 's', 'paul', 'robert']

test(['b', 'sue', 'paul'],
     ['s', 'paul', 'bob', 'robert']);
  // ['bob', 's', 'paul']

test(['b', 'b', 'sue', 'paul'],
     ['s', 'paul', 'bob', 'robert']);
  // ['bob', 'b', 's', 'paul']

test(['b', 'b', 'sue', 'paul'],
     ['s', 'paul', 'bob', 'robert', 'bill']);
  // ['bob', 'bill', 's', 'paul']


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接