访问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中使用的简单方法。