如何转换一个数组中的首字母以匹配另一个数组中的值

时间:2019-03-14 17:37:13

标签: javascript arrays

我有两个数组:

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

我想将array1:'s'中的首字母转换为array2:'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。

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您已经在使用findIndex来定位元素在数组中的位置;因此,与其扔掉它而只返回一个布尔值以告诉它是否为-1,不如使用它来对数组建立索引(当然,如果它不是-1)。

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

答案 2 :(得分: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

答案 3 :(得分:0)

您可以使用地图查找

这里的想法是-

  • 首先,我们遍历A参数。
  • 对于A的每个值,我们将其与参数B中的缩写匹配。已经使用过的对象可以跟踪以前使用的替换。
  • 如果我们找到一个既不伪造也不用于任何先前替代的值,则将其映射到最终输出。如果不是,我们保持价值不变

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

答案 4 :(得分: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']