【问题标题】:how to add an element of array to another object and count number如何将数组的元素添加到另一个对象并计数
【发布时间】:2017-01-12 20:24:41
【问题描述】:

首先,我有一个包含如下对象元素的数组:

$scope.selectedIngredient = [object1, object2, object3, object1, object2];

其次,我有一个新对象:

$scope.selectedIngredientResults = {};

现在我想在javascript中实现一个这样的功能:

计算数组的每个对象元素,并将它们放入一个新对象中并存储每个对象

计数

$scope.selectedIngredientResults = [

    {"object" : object1, "count" : 2},
    {"object" : object2, "count" : 2},
    {"object" : object3, "count" : 1}

];

[![这里是新的对象结果,这就是我想要的,

我正在尝试使用

$scope.addIngredient = function(selectedElement) {

console.log('selectedElement', selectedElement);
$scope.selectedIngredient.push(selectedElement);
console.log('$scope.selectedIngredient' , $scope.selectedIngredient);
$scope.selectedIngredientResults = {};
var lengthofR = $scope.selectedIngredient.length;

for (var i = lengthofR - 1; i >= 0; i--) {
    var selected = $scope.selectedIngredient[i]['ingredient_id'];
    console.log('lengthofR', lengthofR);
    if(selected){
        if($scope.selectedIngredientResults.hasOwnProperty(selected)){

            $scope.selectedIngredientResults[$scope.selectedIngredient]++;
        }else {
      $scope.selectedIngredientResults[$scope.selectedIngredient] = 1;
        }
         console.log('$scope.selectedIngredientResults', $scope.selectedIngredientResults ); 
        }
    }

}

【问题讨论】:

  • 您如何将两个对象识别为相同的(实际上是相同的对象,还是只是相同的属性)?
  • 请添加一些数据进行计数。
  • @Paddy 每个对象都有成分 ID 并使用 obj.hasOwnProperty 来识别 for (var i = lengthofR - 1; i >= 0; i--) { var selected = $scope.selectedIngredient[i] ['ingredient_id']; console.log('lengthofR', lengthofR); if(selected){ if($scope.selectedIngredientResults.hasOwnProperty(selected)){ $scope.selectedIngredientResults[$scope.selectedIngredient]++; }else { $scope.selectedIngredientResults[$scope.selectedIngredient] = 1; }
  • 我知道这不是答案,但对于这种任务,lodash 很棒lodash.com
  • 如果这是一个 AngularJS 问题,请将其标记为这样,因为它可能会增加与 vanilla Javascript 不同的注意事项。

标签: javascript angularjs arrays object


【解决方案1】:

** 我花了一些时间来学习这些新方法,并从中获得一些灵感并通过另一种方式解决,非常感谢你们**

myApp.controller('addIngredientCtrl', function($scope) {
$scope.selectedIngredient = [];

$scope.addIngredient = function(selectedElement) {
var elementIndex = $scope.selectedIngredient.indexOf(selectedElement);
if(elementIndex === -1) {
  selectedElement['customerCartQuantity'] = 1;
  $scope.selectedIngredient.push(selectedElement);
} else {
  $scope.changeIngredientQuantity($scope.selectedIngredient[elementIndex],   1);
 }
 }

$scope.changeIngredientQuantity = function(selectedElement, value) {
var elementIndex = $scope.selectedIngredient.indexOf(selectedElement);
$scope.selectedIngredient[elementIndex].customerCartQuantity += value; 
if($scope.selectedIngredient[elementIndex].customerCartQuantity == 0) {
  $scope.selectedIngredient.splice(elementIndex, 1);
}

} });

【讨论】:

    【解决方案2】:

    我想这已经得到了回答,但这里是如何在一次减少中做到这一点:

    $scope.selectedIngredientResults = $scope.selectedIngredient.reduce(function (result, item) {
        var foundIndex = -1;
        var found = result.some(function (alreadyCounted, i) {
            if (alreadyCounted.object.ingredient_id === item.ingredient_id) {
                foundIndex = i;
                return true;
            }
            return false;
        });
        if (found && foundIndex !== -1) result[foundIndex].count += 1;
        else result.push({object: item, count: 1});
        return result;
    }, []);
    

    【讨论】:

      【解决方案3】:

      首先您需要通过您的密钥应用 group by。然后从分组中提取结果。这是您需要的转换函数。

      function transform(items) {
          items = items.reduce(function (memo, val) {
              var key = val['ingredient_id'];
              if (!memo[key]) {
                  memo[key] = [];
              }
              memo[key].push(val);
      
              return memo;
          }, {});
      
          var result = [];
          for (var k in items) {
              var groups = items[k];
              result.push({ 'object': groups[0], 'count': groups.length });
          }
      
          return result;
      }
      

      【讨论】:

      • 我试图理解你的代码,但我仍然无法理解这里发生了什么 items = items.reduce(function (memo, val) { var key = val['ingredient_id']; if (!memo[key]) { memo[key] = []; } memo[key].push(val); return memo; }, {});
      • 它正在应用 group by 操作。只需 console.log(items) 当减少完成时,你就会知道为了更多的 reduce 做了什么,请参阅(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。 :)
      • 你能解释一下 val['ingredient_id'] 吗?@Sufian Saory
      • val 是减少迭代的当前对象。 val['ingredient_id'] 是成分 ID 的值,它是我们分组操作的键。请参阅 (w3schools.com/jsref/jsref_reduce.asp) 以减少示例。
      • 谢谢@Sufian Saory
      【解决方案4】:
      function getIngredientResults (ingredients) {
        var source = [].slice.call(ingredients)
        var result = []
      
        while (source.length > 0) {
          // Move first item from source.
          var current = source.shift()
      
          // Find indexes of duplicate entries.
          var duplicateIndexes = source.reduce(function (carry, item, index) {
            if (item.ingredient_id === current.ingredient_id) {
              carry.push(index)
            }
      
            return carry
          }, [])
      
          // Remove duplicates from source.
          duplicateIndexes.forEach(function (index) {
            source.splice(index, 1)
          })
      
          // Add data to result
          result.push({
            ingredient: current,
            count: duplicateIndexes.length + 1
          })
        }
      
        return result
      }
      

      【讨论】:

      • 对不起@Jon Koops 这是我的错,我应该标记它 AngularJS,但仍然感谢您的帮助
      • 这只是一个函数,你可以在AngularJS中使用它。 AngularJS 仍然是 JavaScript...
      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多