Получение объектов с собственными свойствами на основе ключа - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь получить keys от объекта, используя coffeescript, где key - это определенное значение, но я также получаю свойства функции вместе с собственными свойствами объекта.

При получении свойств функции я получаю эту ошибку, поскольку выражение track by не существует в этих свойствах функции.

[ngRepeat: dupes] Дубликаты в повторителе не допускаются. Используйте выражение «track by» для указания уникальных ключей. Повторитель: prod in products | track by prod.ProductTypeCode, дубликат ключа: undefined

Это track by выражение:

<option ng-repeat="prod in products | track by prod.ProductTypeCode"
        value="{{prod.ProductTypeCode}}">{{prod.ProductType}}
</option>

Я указал own key в цикле for of, но я все еще получаю такие функции, как isEmpty и contains в моем массиве результатов.

Я использую этот for of цикл.

product for own key, product of $scope.products when key isnt 'RTMT'

Это мой $scope.Products, который содержит ключи.

{
  CK: {
    ProductCategoryCode: 'DEP',
    ProductCategory: 'Deposit',
    ProductTypeCode: 'CK'
  },
  RTMT: {
    ProductCategoryCode: 'RTMT',
    ProductCategory: 'Retirement',
    ProductTypeCode: 'IRA'
  },
  SAV: {
    ProductCategoryCode: 'DEP',
    ProductCategory: 'Deposit',
    ProductTypeCode: 'SAV'
  },
  TD: {
    ProductCategoryCode: 'DEP',
    ProductCategory: 'Deposit',
    ProductTypeCode: 'TD'
  }
}

Пока я получаю только CK, SAV и TD, я также получаю это:

Result from for loop

Как мне получить Object типы, а не function типы в coffeescript?

Используя скомпилированный javascript, он, кажется, работает в этом фрагменте, но показывает функции также в окне отладки Firefox.

// Generated
var hasProp = {}.hasOwnProperty,
  indexOf = [].indexOf || function(item) {
    for (var i = 0, l = this.length; i < l; i++) {
      if (i in this && this[i] === item) return i;
    }
    return -1;
  };

var obj = {
  CK: {
    ProductCategoryCode: 'DEP',
    ProductCategory: 'Deposit',
    ProductTypeCode: 'CK'
  },
  RTMT: {
    ProductCategoryCode: 'RTMT',
    ProductCategory: 'Retirement',
    ProductTypeCode: 'IRA'
  },
  SAV: {
    ProductCategoryCode: 'DEP',
    ProductCategory: 'Deposit',
    ProductTypeCode: 'SAV'
  },
  TD: {
    ProductCategoryCode: 'DEP',
    ProductCategory: 'Deposit',
    ProductTypeCode: 'TD'
  }
};

console.log(getValues(obj));


function getValues(obj) {
  // Generated
  var key, product, ref, results;
  ref = obj; // $scope.products;
  results = [];
  for (key in ref) {
    if (!hasProp.call(ref, key)) continue;
    product = ref[key];
    if (key !== 'RTMT') {
      results.push(product);
    }
  }
  return results;
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я думаю, track by $index должно быть достаточно, и вы больше не получите это исключение.

<option ng-repeat="prod in products | track by $index" value="{{prod.ProductTypeCode}}">{{prod.ProductType}}</option>
0 голосов
/ 11 января 2019

Вы можете проверить typeof каждое свойство, чтобы увидеть, является ли оно функцией:

function getValues(obj) {
  // Generated
  var key, product, ref, results;
  ref = obj; // $scope.products;
  results = [];
  for (key in ref) {
    if (!hasProp.call(ref, key)) continue;
    product = ref[key];
    if (key !== 'RTMT' && typeof ref[key] !== 'function') {
      results.push(product);
    }
  }
  return results;
}
...