Объекты и массивы имеют множество встроенных методов, которые могут помочь вам в обработке данных.
Примечание: во многих примерах я использую функции arrow . Они аналогичны выражениям функции , но они связывают значение this
лексически.
Object.keys()
, Object.values()
(ES 2017) и Object.entries()
(ES 2017) Object.keys()
возвращает массив ключей объекта, Object.values()
возвращает массив значений объекта, а Object.entries()
возвращает массив ключей объекта и соответствующие значения в формате [key, value]
.
const obj = {
a: 1
,b: 2
,c: 3
}
console.log(Object.keys(obj)) // ['a', 'b', 'c']
console.log(Object.values(obj)) // [1, 2, 3]
console.log(Object.entries(obj)) // [['a', 1], ['b', 2], ['c', 3]]
Object.entries()
с (g15) const obj = {
a: 1
,b: 2
,c: 3
}
for (const [key, value] of Object.entries(obj)) {
console.log(`key: ${key}, value: ${value}`)
}
Очень удобно повторять результат Object.entries()
с для цикла и .
Цикл for-loop позволяет выполнять итерацию элементов массива. Синтаксис for (const element of array)
(мы можем заменить const
на var
или let
, но лучше использовать const
, если мы не намерены изменять element
).
Назначение destructuring позволяет извлекать значения из массива или объекта и назначать их переменным. В этом случае const [key, value]
означает, что вместо назначения массива [key, value]
на element
мы назначим первый элемент этого массива key
, а второй - value
. Это эквивалентно этому:
for (const element of Object.entries(obj)) {
const key = element[0]
,value = element[1]
}
Как вы можете видеть, деструктуризация делает это намного проще.
Array.prototype.every()
и Array.prototype.some()
Метод every()
возвращает true
, если указанная функция обратного вызова возвращает true
для каждого элемента массива. Метод some()
возвращает true
, если указанная функция обратного вызова возвращает true
для некоторого (хотя бы одного) элемента.
const arr = [1, 2, 3]
// true, because every element is greater than 0
console.log(arr.every(x => x > 0))
// false, because 3^2 is greater than 5
console.log(arr.every(x => Math.pow(x, 2) < 5))
// true, because 2 is even (the remainder from dividing by 2 is 0)
console.log(arr.some(x => x % 2 === 0))
// false, because none of the elements is equal to 5
console.log(arr.some(x => x === 5))
Array.prototype.find()
и Array.prototype.filter()
Методы find()
возвращают первый ], который удовлетворяет предоставленной функции обратного вызова. Метод filter()
возвращает массив из всех элементов, который удовлетворяет предоставленной функции обратного вызова.
const arr = [1, 2, 3]
// 2, because 2^2 !== 2
console.log(arr.find(x => x !== Math.pow(x, 2)))
// 1, because it's the first element
console.log(arr.find(x => true))
// undefined, because none of the elements equals 7
console.log(arr.find(x => x === 7))
// [2, 3], because these elements are greater than 1
console.log(arr.filter(x => x > 1))
// [1, 2, 3], because the function returns true for all elements
console.log(arr.filter(x => true))
// [], because none of the elements equals neither 6 nor 7
console.log(arr.filter(x => x === 6 || x === 7))
Array.prototype.map()
Метод map()
возвращает массив с результатами вызова предоставленной функции обратного вызова для элементов массива.
const arr = [1, 2, 3]
console.log(arr.map(x => x + 1)) // [2, 3, 4]
console.log(arr.map(x => String.fromCharCode(96 + x))) // ['a', 'b', 'c']
console.log(arr.map(x => x)) // [1, 2, 3] (no-op)
console.log(arr.map(x => Math.pow(x, 2))) // [1, 4, 9]
console.log(arr.map(String)) // ['1', '2', '3']
] Array.prototype.reduce()
Метод reduce()
уменьшает массив до одного значения, вызывая предоставленную функцию обратного вызова с двумя элементами .
const arr = [1, 2, 3]
// Sum of array elements.
console.log(arr.reduce((a, b) => a + b)) // 6
// The largest number in the array.
console.log(arr.reduce((a, b) => a > b ? a : b)) // 3
Метод reduce()
принимает необязательный второй параметр, который является начальным значением. Это полезно, когда массив, на который вы вызываете reduce()
, может иметь нуль или один элемент. Например, если бы мы хотели создать функцию sum()
, которая принимает массив в качестве аргумента и возвращает сумму всех элементов, мы могли бы написать это следующим образом:
const sum = arr => arr.reduce((a, b) => a + b, 0)
console.log(sum([])) // 0
console.log(sum([4])) // 4
console.log(sum([2, 5])) // 7
Я не уверен на 100%, что ошибка в ваших данных, но попробуйте запустить код с
data = fread(input = "../data.txt", sep = "\t", fill = TRUE)
в параметрах fread. У меня была аналогичная ошибка, и казалось, что у fread возникли проблемы с идентификацией разделения столбцов. Установка fill в true позволяет fread заполнять любые отсутствующие данные - по крайней мере, тогда вы можете проверить полученный результирующий фрейм данных и выяснить, где находится странность.
Добавить fill = TRUE
в синтаксис
Что происходит: Строки в данных имеют неравную длину. В этом синтаксисе пустые поля неявно заполняются.