-4

我有一个稀疏的数组条目/项目数组,如下所示......

var indexed = new Array();

indexed["5"] = [35, 2];
indexed["3"] = [20, 2];
indexed["4"] = [25, 3];

我想通过提供一个项目的数组索引(分别是它的键)在这样一个稀疏数组结构中找到一个条目/项目的“真实”位置计数

预期成绩:

  • 如果确实提供3(作为字符串或数字值),则返回的(索引)值应该是数字值0
  • 如果确实提供4(作为字符串或数字值),则返回的(索引)值应该是数字值1
  • 如果确实提供5(作为字符串或数字值),则返回的(索引)值应该是数字值2
  • 如果搜索不成功,返回值应该是数字值-1
4

1 回答 1

0

一种有效的方法是按其find方法搜索数组。那么回调方法就需要实现匹配条件,即……当前处理的数组项是否有key,一个正在寻找……

obj => obj.hasOwnProperty(key)

findthen 确实返回(第一个)匹配对象或返回undefined值。对于后一种情况,为了防止访问 的属性undefined,可以使用可选的链接/?.运算符

最终的解决方案可能看起来类似于下一个提供的解决方案......

const sampleList = [{
  '2': [1, 3],
}, {
  '3': [1, 4],
}, {
  '4': [2, 6],
}];

function getFirstItemOfObjectByKey(arr, key) {
  return (arr.find(obj =>
    obj.hasOwnProperty(key)
  ))?.[key][0];
}

console.log(
  getFirstItemOfObjectByKey(sampleList, 4) // expected: 2
);
console.log(
  getFirstItemOfObjectByKey(sampleList, 3) // expected: 1
);
console.log(
  getFirstItemOfObjectByKey(sampleList, 1) // expected: undefined
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

如果有人被迫使用某种滥用的稀疏数组结构,就像 OP 正在经历的那样,上述方法会稍微改变为......

var abusedSparseArray = new Array();

abusedSparseArray["3"] = [20, 2];
abusedSparseArray["4"] = [25, 3];
abusedSparseArray["5"] = [35, 2];

function getFirstItemOfArrayEntryByEntryKey(arr, key) {
  return (arr.find((entry, idx) =>
    idx === key
  ) || [])[0];
}

console.log(
  getFirstItemOfArrayEntryByEntryKey(abusedSparseArray, 3) // expected: 20
);
console.log(
  getFirstItemOfArrayEntryByEntryKey(abusedSparseArray, 4) // expected: 25
);
console.log(
  getFirstItemOfArrayEntryByEntryKey(abusedSparseArray, 5) // expected: 35
);
console.log(
  getFirstItemOfArrayEntryByEntryKey(abusedSparseArray, 1) // expected: undefined
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

最终结果证明,OP 想通过在这样的稀疏数组结构中查找这样的条目来了解稀疏数组中条目/项目的某种真实位置计数。indexkey

在这种情况下,必须将稀疏数组视为普通(键值)对象。将这样的对象传递给Object.entries,得到一个条目数组,其中每个条目是一个包含两个项目的数组,即条目键和条目值。现在只需要找到稀疏数组项的键的索引/findIndex正在寻找...

const sparseArray = new Array();

sparseArray["5"] = [35, 2];
sparseArray["3"] = [20, 2];
sparseArray["4"] = [25, 3];

function getRealPositionCountOfSparseArrayEntryByKey(arr, key) {
  key = String(key);
  return Object
    .entries(arr)
    .findIndex(entry => entry[0] === key);
}

console.log(
  getRealPositionCountOfSparseArrayEntryByKey(sparseArray, 3) // expected: 0
);
console.log(
  getRealPositionCountOfSparseArrayEntryByKey(sparseArray, 4) // expected: 1
);
console.log(
  getRealPositionCountOfSparseArrayEntryByKey(sparseArray, 5) // expected: 2
);
console.log(
  getRealPositionCountOfSparseArrayEntryByKey(sparseArray, 1) // expected: -1
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

于 2021-02-18T09:46:30.877 回答