Как определить, есть ли у Собственного объекта JavaScript свойство / метод?

Вот, возможно, более простой подход с использованием mdates, хотя вам нужно перебирать ваши столбцы, вызывая отображение бар из matplotlib. Вот пример, когда я рисую только один столбец и использую mdates для настраиваемых тиков и меток (EDIT). Добавлена ​​функция циклирования для построения всех столбцов):

import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

def format_x_date_month_day(ax):   
    # Standard date x-axis formatting block, labels each month and ticks each day
    days = mdates.DayLocator()
    months = mdates.MonthLocator()  # every month
    dayFmt = mdates.DateFormatter('%D')
    monthFmt = mdates.DateFormatter('%Y-%m')
    ax.figure.autofmt_xdate()
    ax.xaxis.set_major_locator(months) 
    ax.xaxis.set_major_formatter(monthFmt)
    ax.xaxis.set_minor_locator(days)

def df_stacked_bar_formattable(df, ax, **kwargs):
    P = []
    lastBar = None

    for col in df.columns:
        X = df.index
        Y = df[col]
        if lastBar is not None:
            P.append(ax.bar(X, Y, bottom=lastBar, **kwargs))
        else:
            P.append(ax.bar(X, Y, **kwargs))
        lastBar = Y
    plt.legend([p[0] for p in P], df.columns)

span_days = 90
start = pd.to_datetime("1-1-2012")
idx = pd.date_range(start, periods=span_days).tolist()
df=pd.DataFrame(index=idx, data={'A':np.random.random(span_days), 'B':np.random.random(span_days)})

plt.close('all')
fig, ax = plt.subplots(1)
df_stacked_bar_formattable(df, ax)
format_x_date_month_day(ax)
plt.show()

(Ссылка matplotlib.org , например, для создания стробированного графика штрихов.) Это дает нам

. Другой подход, который должен работать и быть намного проще, - использовать df.plot.bar(ax=ax, stacked=True), однако он не допускает форматирование оси даты с mdates и является предметом моего вопроса .

20
задан scunliffe 27 February 2009 в 17:33
поделиться

4 ответа

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

alert( typeof Array.prototype.push );
alert( typeof Array.prototype.foo );

, Когда Вы выполняетесь typeof Array.push, Вы тестируете, если сам объект Массива имеет метод нажатия, не, если экземпляры Массива имеют метод нажатия.

32
ответ дан Peter Bailey 27 February 2009 в 17:33
поделиться
  • 1
    @nhahtdh I' m не уверенный в механике того, как то отображение сделано. Я думал бы, что загрузчик программы знает, что информация и передает его программе, но that' s просто мое предположение. Кто-то хочет прокомментировать и объяснить, что на самом деле происходит? – Oleksi 27 May 2012 в 16:56

И это действительно хорошо работает в Firefox

, который Это только по совпадению! Вы не можете обычно ожидать, что метод прототипа также будет существовать на функции конструктора.

if(typeof(Array().push) == 'undefined')

Это было почти правильно кроме Вас, забывают new, постоянный глюк JavaScript. new Array().push, или [].push, если коротко, правильно проверил бы, что экземпляр имел метод, который Вы хотели.

3
ответ дан Ry- 27 February 2009 в 17:33
поделиться

Правильный способ проверить, существует ли свойство:

if ('property' in objectVar)
56
ответ дан 29 November 2019 в 06:09
поделиться

К .hasOwnProperty можно получить доступ через proptotype массива, если typeof недостаточно идиоматичен.


if (Array.prototype.hasOwnProperty('push')) {
    // Native array has push property
}

8
ответ дан 29 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

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