diff --git a/packages/grafana-data/src/dataframe/DataFrameView.test.ts b/packages/grafana-data/src/dataframe/DataFrameView.test.ts index a13471c66b0..91368341aba 100644 --- a/packages/grafana-data/src/dataframe/DataFrameView.test.ts +++ b/packages/grafana-data/src/dataframe/DataFrameView.test.ts @@ -81,4 +81,19 @@ describe('dataFrameView', () => { value: 1, }); }); + + it('Can handle fields with number name', () => { + const view = new DataFrameView( + new MutableDataFrame({ + fields: [ + { name: '1', type: FieldType.string, values: ['a'] }, + { name: '2', type: FieldType.string, values: ['b'] }, + ], + }) + ); + + const obj = view.get(0) as any; + expect(obj['1']).toEqual('a'); + expect(obj['2']).toEqual('b'); + }); }); diff --git a/packages/grafana-data/src/dataframe/DataFrameView.ts b/packages/grafana-data/src/dataframe/DataFrameView.ts index b96055813c9..8e88813c1cb 100644 --- a/packages/grafana-data/src/dataframe/DataFrameView.ts +++ b/packages/grafana-data/src/dataframe/DataFrameView.ts @@ -32,10 +32,12 @@ export class DataFrameView extends FunctionalVector { }); } - Object.defineProperty(obj, i, { - enumerable: false, // Don't enumerate array index - get: getter, - }); + if (!(obj as any).hasOwnProperty(i.toString())) { + Object.defineProperty(obj, i, { + enumerable: false, // Don't enumerate array index + get: getter, + }); + } } this.obj = obj; diff --git a/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.test.ts b/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.test.ts index 0873a4b3586..29bdff2e750 100644 --- a/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.test.ts +++ b/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.test.ts @@ -151,4 +151,26 @@ describe('Rows to fields', () => { expect(result.fields[0].name).toEqual('Stockholm'); expect(result.fields[0].values.get(0)).toEqual(20); }); + + it('Can handle number fields as name field', () => { + const input = toDataFrame({ + fields: [ + { name: 'SensorID', type: FieldType.number, values: [10, 20, 30] }, + { name: 'Value', type: FieldType.number, values: [1, 2, 3] }, + ], + }); + + const result = rowsToFields( + { + mappings: [ + { fieldName: 'SensorID', handlerKey: 'field.name' }, + { fieldName: 'Value', handlerKey: 'field.value' }, + ], + }, + input + ); + + expect(result.fields[0].name).toEqual('10'); + expect(result.fields[0].values.get(0)).toEqual(1); + }); }); diff --git a/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.ts b/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.ts index fc5bbd21478..b72b9516752 100644 --- a/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.ts +++ b/public/app/core/components/TransformersUI/rowsToFields/rowsToFields.ts @@ -57,7 +57,7 @@ export function rowsToFields(options: RowToFieldsTransformOptions, data: DataFra const labels = getLabelsFromRow(data, index, mappingResult); const field: Field = { - name: name, + name: `${name}`, type: valueField.type, values: new ArrayVector([value]), config: config,