根据键检索对象自己的属性

时间:2019-01-10 21:50:20

标签: javascript angularjs coffeescript angularjs-ng-repeat

我试图使用keys是特定值的coffeescript从对象中获取key,但是我也同时获得了函数属性和对象自身的属性。

在获取函数属性时,我遇到此错误,因为这些函数属性上不存在track by表达式。

  

[ngRepeat:dupes]不允许在转发器中重复。使用“跟踪依据”表达式指定唯一键。中继器: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,但是在结果数组中仍然获得了isEmptycontains之类的函数。

我正在使用此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'
  }
}

虽然我只得到CKSAVTD,但我也得到了:

Result from for loop

如何仅在咖啡脚本中获取Object类型而不是function类型?

使用已编译的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 :(得分:0)

您可以检查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;
}

答案 1 :(得分:0)

我认为track by $index就足够了,您将不再收到该异常。

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