获取数组索引键 - Javascript

Get Array Index Key - Javascript

问题

我正在遍历状态数组,看起来像这样

let states = [
                ['AL', 0],
                ['AK', 0],
                ['AZ', 0],
                ['AR', 0],
                ['CA', 0]......
]

并将其与州代码后实际具有值的州数组进行比较。我有一个函数试图通过检查第一个数组并查看键(状态)是否存在于第二个数组中来合并两个数组。如果是这样,它应该用第二个数组中找到的数组替换该数组。

我试过了

下面是我的尝试,它显然不起作用,我试过移动数组索引并只获取状态代码,但这会引发未定义的错误。

function mergeArrays(arr1, arr2) {
        for(let i = 0; i < arr1.length; i++) {
            let arr1state = arr1[i];
            let arr2state = arr2[i];
            if (arr1state === arr2state) {
                console.log(arr1[i], arr2[i])
            }
        }
    }

遍历第一个状态数组并在第二个状态数组中找到相应的数组(您可以使用 reduce 来做到这一点):

const states1 = [
  ['AL', 0],
  ['AK', 0],
  ['AZ', 0],
  ['AR', 0],
  ['CA', 0],
]

const states2 = [
  ['AL', 1],
  ['AZ', 3],
  ['CA', 5],
]

const mergeStates = ({ arr1, arr2 }) => {
  // iterate over the first array:
  return arr1.reduce((a, [state1, val1]) => {
    // find the corresponding item in the second array:
    const item = arr2.find(([state2]) => state1 === state2)
    
    // check if item exists
    if (item) {
      const [_, val2] = item
      a = [...a, [state1, val2]]
    } else {
      a = [...a, [state1, val1]]
    }
    return a
  }, [])
}

const merged = mergeStates({
  arr1: states1,
  arr2: states2
})

console.log(merged)


或更简单的解决方案:

const states1 = [
  ['AL', 0],
  ['AK', 0],
  ['AZ', 0],
  ['AR', 0],
  ['CA', 0],
]

const states2 = [
  ['AL', 1],
  ['AZ', 3],
  ['CA', 5],
]

const mergeStates = ({ arr1, arr2 }) => {
  // creating objects from the arrays:
  const baseObj = Object.fromEntries(arr1)
  const newObj = Object.fromEntries(arr2)

  // spreading the objects, so the latter
  // overwrites the former if keys match
  // then turning it back to an array
  return Object.entries({
    ...baseObj,
    ...newObj,
  })
}

const merged = mergeStates({
  arr1: states1,
  arr2: states2
})

console.log(merged)

我会遍历实际状态,即具有正确值的状态,然后将它们放入地图中。

然后迭代 states 数组并检查您想要的值是否存在于所述映射中。

let states = [['AL', 0],
                ['AK', 0],
                ['AZ', 0],
                ['AR', 0],
                ['CA', 0]];

let actualStates = [['AL', 1],
                ['AK', 2],
                ['AZ', 3],
                ['CA', 4]];

function merge(states, actualStates){
    let map = {};
    for(let actualState of actualStates) map[actualState[0]] = actualState[1];
    for(let state of states) state[1] = map[state[0]] || state[1];
    return states;
}

console.log(merge(states, actualStates));

您正在比较两个数组,而不是它们的键,您应该比较的是 arr1state[0] === arr2state[0],否则您将只是检查 ['AL', 0] === ['AL', 13],例如 arr1state实际上持有 ['AL', 0] i = 0.

但是,还有一个问题是您希望两个数组具有相同的长度,并且顺序相同,要解决此问题,您需要迭代整个第二个数组以寻找一个状态键,对于每个第一个数组中的元素。所以,像这样:

function mergeArrays(arr1, arr2) {
    for(let i = 0; i < arr1.length; i++) {
        let arr1state = arr1[i][0];
        for(let j = 0; j < arr2.length; j++) {
            let arr2state = arr2[j][0];
            if (arr1state === arr2state) {
                console.log(`[${i}, ${j}] ${arr1[i]}, ${arr2[j]}`);
            }
        }
    }
}

这个例子实际上并没有进行合并,因为你没有提到你是否只想替换它,或者如果只有其中一个有值会发生什么,但是它应该已经回答了你的问题出了什么问题,并允许您修复代码。