// (IE9+) Two steps
var pathString = "[0]['property'].others[3].next['final']";
var obj = [{
property: {
others: [1, 2, 3, {
next: {
final: "SUCCESS"
}
}]
}
}];
// Turn string to path array
var pathArray = pathString
.replace(/\[["']?([\w]+)["']?\]/g,".$1")
.split(".")
.splice(1);
// Add object prototype method
Object.prototype.path = function (path) {
try {
return [this].concat(path).reduce(function (f, l) {
return f[l];
});
} catch (e) {
console.error(e);
}
};
// usage
console.log(obj.path(pathArray));
console.log(obj.path([0,"doesNotExist"]));
Плюс он возвращает общее количество элементов во всех измерениях массива, поэтому он может быть массивом с «всего лишь» полумиллиардом элементов и 4 измерениями, чтобы сделать его необходимым 64-битным int.
Например, если у вас есть файл размером> 2 ГБ и вам необходимо сразу прочитать все это в памяти, это вызовет такой массив. Не то, что это всегда рекомендуется в большинстве случаев, но вполне может быть какой-то случай (на достаточно мощной 64-разрядной системе с большой памятью), что это может потребоваться (возможно, по соображениям производительности?).
Редактирование: Конечно, следует отметить, что с CLR 2.0 наличие массива> 2 ГБ на самом деле не поддерживается (вся реализация LongLength делает линией длину длинной и пытается создать большой массив не удастся) ... но, возможно, Microsoft планирует добавить поддержку позже ...?
Очень возможно иметь массив с более чем 2 миллиардами записей в 64-битном сценарии. LongLength действительно предназначен для поддержки таких сценариев.
Что касается того, действительно ли это используется. Я могу с уверенностью сказать, что есть какой-то клиент, где-то, который считает это жизненно важной задачей бизнеса. Клиенты находят применение для функций, которые вы никогда не считали возможными.
Существует школа мысли, известная как школа «0, 1 или N», которая полагает, что вам ничто не должно быть; одно из чего-то; или любой номер чего-либо, как позволяют ресурсы.
Другими словами, не устанавливайте произвольные пределы, если вам это не нужно. Произвольные лимиты дали нам такие чудовища, как:
Имейте в виду, что даже два миллиарда 64-битных целых числа занимают только
17,179,869,184 bytes of the
18,446,744,073,709,551,616 bytes of 64-bit address space available.
. Это меньше 1 тысячи миллионных или 10-9 или вы могли бы много миллионов этих массивных массивов до истечения адресного пространства.
Array.Length
также «получает общее количество элементов во всех измерениях массива». – dlatikay 8 December 2017 в 13:05