获取数组索引键 - 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]}`);
}
}
}
}
这个例子实际上并没有进行合并,因为你没有提到你是否只想替换它,或者如果只有其中一个有值会发生什么,但是它应该已经回答了你的问题出了什么问题,并允许您修复代码。
问题
我正在遍历状态数组,看起来像这样
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]}`);
}
}
}
}
这个例子实际上并没有进行合并,因为你没有提到你是否只想替换它,或者如果只有其中一个有值会发生什么,但是它应该已经回答了你的问题出了什么问题,并允许您修复代码。