Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问javascript中某个()函数中使用的对象_Javascript - Fatal编程技术网

访问javascript中某个()函数中使用的对象

访问javascript中某个()函数中使用的对象,javascript,Javascript,我编写这个函数是为了组合重复的对象并添加它们的数量 我在增加数量时遇到问题 function removeDuplicates (input){ var new_array = []; input.forEach(function(unmerged){ if(new_array.some(item => item.model === unmerged.model)){ item.quantity += unmerged.quantity; ///

我编写这个函数是为了组合重复的对象并添加它们的数量

我在增加数量时遇到问题

function removeDuplicates (input){

  var new_array = [];

  input.forEach(function(unmerged){
      if(new_array.some(item => item.model === unmerged.model)){
          item.quantity += unmerged.quantity; ////this throws error
      } else {
          new_array.push(unmerged);
      }
  });

  return new_array;
};
我假设“item”只在some()函数中创建和使用,不再可访问。如何修复此函数以便编辑其属性

例:

功能开始前:

var product_array = [
    {model:1, quantity:3},
    {model:1, quantity:2},
    {model:2, quantity:1}
];
var product_array = [
    {model:1, quantity:5},
    {model:2, quantity:1}
]
功能后:

var product_array = [
    {model:1, quantity:3},
    {model:1, quantity:2},
    {model:2, quantity:1}
];
var product_array = [
    {model:1, quantity:5},
    {model:2, quantity:1}
]

您是对的,项目只能在arrow函数范围内访问

您可以使用下划线(或lodash)。查找函数

例如:

var item = _.find(new_array, {model : unmerged.model});
if (item) { 
    item.quantity += unmerged.quantity; 
}
您还可以为它使用es6新的数组函数

var item = new_array.find(elem => elem.model ===unmerged.model);

您是对的,项目只能在arrow函数范围内访问

您可以使用下划线(或lodash)。查找函数

例如:

var item = _.find(new_array, {model : unmerged.model});
if (item) { 
    item.quantity += unmerged.quantity; 
}
您还可以为它使用es6新的数组函数

var item = new_array.find(elem => elem.model ===unmerged.model);

对于ES5,这不是最优雅的解决方案,但您可以这样做:

function comparator(obj1, obj2) {
  if (obj1.model < obj2.model) return -1;
  if (obj1.model > obj2.model) return 1;
  return 0;
}

function combineDuplicates(arr, comparator) {
  arr.sort(comparator);

  for (var i = 0; i < arr.length - 1; i++) {
    while (arr[i + 1] !== undefined && arr[i].model === arr[i + 1].model) {
      arr[i].quantity += arr[i + 1].quantity;
      arr.splice(i + 1, 1);
    }
  }

  return arr;
}

对于ES5,这不是最优雅的解决方案,但您可以这样做:

function comparator(obj1, obj2) {
  if (obj1.model < obj2.model) return -1;
  if (obj1.model > obj2.model) return 1;
  return 0;
}

function combineDuplicates(arr, comparator) {
  arr.sort(comparator);

  for (var i = 0; i < arr.length - 1; i++) {
    while (arr[i + 1] !== undefined && arr[i].model === arr[i + 1].model) {
      arr[i].quantity += arr[i + 1].quantity;
      arr.splice(i + 1, 1);
    }
  }

  return arr;
}
您可以将项分配给范围内的变量,并使用该变量:

input.forEach(function(unmerged){
  var current; 
  if(new_array.some(item => {current = item; return item.model === unmerged.model})){
    current.quantity += unmerged.quantity; ////this throws error
  } else {
    new_array.push(unmerged);
  }
});
您可以将项分配给范围内的变量,并使用该变量:

input.forEach(function(unmerged){
  var current; 
  if(new_array.some(item => {current = item; return item.model === unmerged.model})){
    current.quantity += unmerged.quantity; ////this throws error
  } else {
    new_array.push(unmerged);
  }
});

您可以在
forEach
循环中将
this
用作合并的临时对象

功能移除副本(输入){
var new_数组=[];
input.forEach(函数(未合并){
如果(!此[unmerged.model]){
此[unmerged.model]=未合并;
新的_数组推送(未合并);
返回;
}
此[unmerged.model].quantity+=unmerged.quantity;
}, {});
返回新的_数组;
};
var乘积_数组=[{model:1,quantity:3},{model:1,quantity:2},{model:2,quantity:1}],
结果=移除的副本(产品数组);

document.write(“”+JSON.stringify(结果,0,4)+“”)
您可以在
forEach
循环中使用
this
作为合并的临时对象

功能移除副本(输入){
var new_数组=[];
input.forEach(函数(未合并){
如果(!此[unmerged.model]){
此[unmerged.model]=未合并;
新的_数组推送(未合并);
返回;
}
此[unmerged.model].quantity+=unmerged.quantity;
}, {});
返回新的_数组;
};
var乘积_数组=[{model:1,quantity:3},{model:1,quantity:2},{model:2,quantity:1}],
结果=移除的副本(产品数组);

document.write(“”+JSON.stringify(结果,0,4)+“”)
你能在数组的示例之前/之后添加吗?@Andy刚刚添加了一个示例。
.some()
之外没有定义。将相同的
项目
数量
添加到自身的目的是什么?预期结果是什么?你能在数组的示例之前/之后添加吗?@Andy刚刚添加了一个示例。
.some()
之外没有定义。将相同的
项目
数量
添加到自身的目的是什么?预期的结果是什么?第二个选项效果很好,lodash版本由于某种原因似乎没有。甚至更好的模式是一个减速机。我用lodash尝试了第一个选项,它对我非常有效,你确定你已经将lodash添加到你的项目中了吗?无论如何,如果您使用es6,我将推荐第二个选项,第一个选项只是在es5中使用的简单方法。第二个选项工作得很好,lodash版本似乎不是出于某种原因。甚至更好的模式是减速器。我用lodash尝试了第一个选项,它对我来说非常适合,您确定已将lodash添加到项目中吗?无论如何,如果您使用es6,我将推荐第二个选项,第一个选项只是在es5中使用的简单方法。