как получить ключи от пустого объекта typescript [duplicate]

Вы можете рассмотреть grep, как в ответе на Использование regexp для выбора строк в R dataframe . Адаптировано к вашим данным:

df <- read.table(text="  Allele1 Allele2      SNP_name gs_entry pedigree_dhl
1       T       T ZM011407_0151      656    CCB133$*1
2       T       T ZM009374_0354      656    CCB133$*1
3       C       C ZM003499_0591      656    CCB133$*1
4       A       A ZM003898_0594      656    CCB133$*1
5       C       C ZM004887_0313      656    CCB133$*1
6       G       G ZM000583_1096      656    CCB133$*1", header=T)

# put into df1 all rows where pedigree_dhl starts with CCB133$
p1 <- 'CCB133$'
df1 <- subset(df, grepl(p1, pedigree_dhl) )

Но ваш вопрос подразумевает, что вы можете выбрать семизначное имя или просто отсортировать строки по имени родословной, и может быть проще сохранить все строки вместе в отсортированном кадре данных. Все эти три операции: подстановка, извлечение нового столбца или сортировка могут выполняться независимо.

# If you want to create a new column based
# on the first seven letter of SNP_name (or any other variable)

df$SNP_7 <- substr(df$SNP_name, start=1, stop=7)

# If you want to order by pedigree_dhl
# then you don't need to select out the rows into a new dataframe

df <- df[ with(df, order(df$pedigree_dhl)), ]

Все это может быть очевидным - я добавляю их просто для полноты.

15
задан Erik Cupal 16 November 2016 в 21:41
поделиться

4 ответа

Этот код TypeScript

class A {
    private a1;
    public a2;
}

компилируется в этот код JavaScript

class A {
}

Это связано с тем, что свойства в JavaScript начинаются только после того, как они имеют некоторое значение. Вы должны назначить свойства некоторым значениям.

class A {
    private a1 = "";
    public a2 = "";
}

он компилируется в

class A {
    constructor() {
        this.a1 = "";
        this.a2 = "";
    }
}

Тем не менее вы не можете получить свойства из простого класса (вы можете получить только методы из прототипа ). Вы должны создать экземпляр. Затем вы получите свойства, вызвав Object.getOwnPropertyNames().

let a = new A();
let array = return Object.getOwnPropertyNames(a);

array[0] === "a1";
array[1] === "a2";

Применяется к вашему примеру

class Describer {
    static describe(instance): Array<string> {
        return Object.getOwnPropertyNames(instance);
    }
}

let a = new A();
let x = Describer.describe(a);
15
ответ дан Erik Cupal 15 August 2018 в 22:32
поделиться
  • 1
    @erik_cupa есть операторы som, которые являются ложными. Главным образом код, созданный машинописным текстом. Например: typescriptlang.org/play/… есть намного больше. – titusfx 15 September 2017 в 10:02
  • 2
    @titusfx машинописная площадка компилирует код в ES5. Чтобы получить то же самое, вам нужно скомпилировать ES6 +. Вы достигаете его, указав цель в параметрах компилятора (либо в качестве аргумента, либо в части tsconfig.json). Подробнее об этом здесь typescriptlang.org/docs/handbook/compiler-options.html – Erik Cupal 15 September 2017 в 18:19
  • 3
    @Erik_Cupal в случае, если вы хотите скомпилировать ES6 + (который не является параметром компилятора по умолчанию, я считаю, что он должен быть указан в ответе). – titusfx 17 September 2017 в 18:26
  • 4
    Досадно, что мы должны определить значение по умолчанию ... особенно в моделях это легко забывается, что может привести к неправильному поведению, которое трудно найти: / – user 8 February 2018 в 11:13

Другое решение. Вы можете просто перебирать объектные ключи так, вы должны сначала создать экземпляр объекта:

printTypeNames<T>(obj: T) {
    const objectKeys = Object.keys(obj) as Array<keyof T>;
    for (let key of objectKeys)
    {
       console.Log('key:' + key);
    }
}
6
ответ дан johnny 5 15 August 2018 в 22:32
поделиться
  • 1
    Объект должен существовать, и свойства будут заполнены, иначе это приведет к невозможности регистрации свойств. – Zarepheth 4 June 2018 в 18:24
  • 2
    @Zarepheth благодарит за разъяснения о необходимых проверках, я опустил их, чтобы избежать беспорядка в ответе, как в предыдущем, этот пример - просто показать, как перебирать ключи – johnny 5 4 June 2018 в 18:30
  • 3
    Если я не ошибаюсь, вопросник хотел получить список свойств класса во время выполнения, возможно, без учета наличия экземпляра этого класса. Я наткнулся на это, пытаясь сделать это и не добившись успеха, если я не создам экземпляр экземпляра. – Zarepheth 4 June 2018 в 20:48
  • 4
    @ Зарефет, я вижу, что ты сейчас говоришь. В настоящее время индексный указатель не поддерживает отражение его типов, я уточнил ответ, чтобы заявить, что вы должны сначала создать экземпляр – johnny 5 4 June 2018 в 20:53

Только для fun

class A {
    private a1 = void 0;
    private a2 = void 0;
}

class B extends A {
    private a3 = void 0;
    private a4 = void 0;
}

class C extends B {
    private a5 = void 0;
    private a6 = void 0;
}

class Describer {
    private static FRegEx = new RegExp(/(?:this\.)(.+?(?= ))/g); 
    static describe(val: Function, parent = false): string[] {
        var result = [];
        if (parent) {
            var proto = Object.getPrototypeOf(val.prototype);
            if (proto) {
                result = result.concat(this.describe(proto.constructor, parent));
            } 
        }
        result = result.concat(val.toString().match(this.FRegEx) || []);
        return result;
    }
}

console.log(Describer.describe(A)); // ["this.a1", "this.a2"]
console.log(Describer.describe(B)); // ["this.a3", "this.a4"]
console.log(Describer.describe(C, true)); // ["this.a1", ..., "this.a6"]

Обновление: если вы используете пользовательские конструкторы, эта функция будет ломаться.

6
ответ дан madreason 15 August 2018 в 22:32
поделиться
  • 1
    is '* = void 0;' приманка? или мы можем просто использовать «private a0: any»? – mboullouz 19 November 2016 в 10:05
  • 2
    Вам нужно инициализировать свойство, чтобы генерировать код конструктора. – madreason 21 November 2016 в 14:08

Некоторые ответы частично ошибочны, и некоторые факты в них также частично ошибочны.

Ответьте на свой вопрос: Да! Вы можете.

В Typcript

class A {
    private a1;
    private a2;


}

Создает следующий код в Javascript:

var A = /** @class */ (function () {
    function A() {
    }
    return A;
}());

как @Erik_Cupal , вы можете просто сделать:

let a = new A();
let array = return Object.getOwnPropertyNames(a);

Но это неполное. Что произойдет, если ваш класс имеет собственный конструктор? Вам нужно сделать трюк с Typcript, потому что он не будет компилироваться. Вам нужно назначить любое:

let className:any = A;
let a = new className();// the members will have value undefined

Общее решение будет:

class A {
    private a1;
    private a2;
    constructor(a1:number, a2:string){
        this.a1 = a1;
        this.a2 = a2;
    }
}

class Describer{

   describeClass( typeOfClass:any){
       let a = new typeOfClass();
       let array = Object.getOwnPropertyNames(a);
       return array;//you can apply any filter here
   }
}

Для лучшего понимания это будет ссылаться в зависимости от контекста.

7
ответ дан titusfx 15 August 2018 в 22:32
поделиться
  • 1
    Хороший взлом! Конечно, не будет работать для каждого конструктора. Представьте себе что-то вроде этого: constructor(callback: {getValue: () => number}) { this.numberValue = callback.getValue(); } – Markus Ende 30 September 2017 в 18:14
Другие вопросы по тегам:

Похожие вопросы: