В JavaScript, хорошо ли объявлять массив для хранения единственного значения, чтобы облегчить итерацию по нему? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть объект, где его ключи могут принимать одно значение или массив значений

Ex: sample = {}
sample[key] = "foo"
sample[bar] = ["Alpha", "Bravo", "Charlie"]

Я в конечном итоге переберу этот объект (sample) и выведу значения,В этом процессе я должен проверить, является ли каждое значение массивом, и если да, мне придется вывести эти значения.

Какая дорогостоящая операция?

Проверять, является ли значение массивом при каждой итерации?

if(Array.isArray(arr[prop]))

ИЛИ

просто сделать все ключи массивами, чтобы яможет с легкостью выполнять итерации, например,

arr[prop].forEach(function(val){}

Алгоритмически объявляет ли дополнительное пространство для облегчения итерации по стоящему объекту?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Один из вариантов - установить для имен свойств, для которых значением является Array, строку, начинающуюся со слова "array", строки, начинающиеся со слова "string", и переменную, объявленную в -1, котораяувеличивается и объединяется с именами свойств по умолчанию "string" и "array"

const arrayKey = "array"
const stringKey = "string"
let arrayIndex = -1
let stringIndex = -1

const sample = {}
sample[`${stringKey}${++stringIndex}`] = "foo"
sample[`${arrayKey}${++arrayIndex}`] = ["Alpha", "Bravo", "Charlie"]
sample[`${stringKey}${++stringIndex}`] = "bar"
  
const setEntry = (o, key, index, value) => o[`${key}${++index}`] = value

const filterEntries = (o, prop) => 
  Object.entries(o).filter(([key]) => prop === key || key.includes(prop))
  .map(([,value]) => value)
  
setEntry(sample, arrayKey, arrayIndex, ["Delta", "Echo", "Foxtrot"])

let arrays = filterEntries(sample, arrayKey)
let strings = filterEntries(sample, stringKey)
let [bar] = filterEntries(sample, stringKey + 1)

console.log(strings)
console.log(arrays)
console.log(sample["string0"])
console.log(sample["array0"])
console.log(sample["string1"])
console.log(sample["array1"])
console.log(bar)
0 голосов
/ 28 февраля 2019

Если это частный объект, то это на самом деле не имеет значения, но, вероятно, лучше отдать предпочтение простому коду.

Если это объект interface , то есть то, чтопредоставляется вам в качестве аргумента функции или с помощью других средств, тогда различие является важным.Если все ключи могут быть многозначными, вам следует просто сделать их массивами, потому что это упрощает интерфейс.

0 голосов
/ 28 февраля 2019

Гораздо проще просто проверить length - если это undefined, предмет является объектом.Если это что-то еще, то это массив:

if (arr[prop].length) { /* arr[prop] is an array */ }

EDIT

Как указано в комментариях, строки также имеют свойство length, поэтому вы должны использовать Array.isArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...