我有一个数组,其中包含多个对象,其中包含以下信息:
string ProductDescription/Name
int Amount
我想创建一个新数组,该数组结合了相同产品描述的数量。示例:第一个数组包含:产品 X 50、产品 X 80 和产品 X 140。
我的新阵列应该是产品 X 270。现在我发现了一些关于检查值是否已经在数组中的东西:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some
但是我想要一些可以检查ProductDescription
的东西,而不是对象。
所以我采用了相同的功能:
function checkAvailability(arr, val)
{
return arr.some(function(arrVal)
{
return val === arrVal;
});
}
我像这样尝试:
var found = checkAvailability(arrayProduct['Productomschrijving'], javascript_array[i]['Productomschrijving']);
但它给出了一个错误...
未捕获的类型错误:无法读取未定义的属性"某些"
当我这样做时:
var found = checkAvailability(arrayProduct, javascript_array[i]['Productomschrijving']);
这总是错误的。有点正常,因为它将字符串与对象进行比较。
那么我怎样才能解决这个问题,我的some
函数正在检查对象的属性而不是整个对象的属性呢?
正确的比较应该与arrVal.Productomschrijving
val
:
function checkAvailability(arr, val) {
return arr.some(function(arrVal) {
return val === arrVal.Productomschrijving;
});
}
你必须使用some()
方法
为什么不简单地检查一下?检查这个小提琴
var objArray = [
{ name : "Product X", amount : 10 },
{ name : "Product X", amount : 100 },
{ name : "Product X", amount : 40 },
]
var newArray = [];
var keyValue = {};
for ( var counter = 0; counter < objArray.length; counter++ )
{
var obj = objArray[ counter ];
if ( !keyValue[ obj.name ] )
{
keyValue[ obj.name ] = 0;
}
keyValue[ obj.name ] += obj.amount;
}
for ( var key in keyValue )
{
newArray.push( { name: key, amount : keyValue[ key ] } );
}
console.log( newArray );
正如您的链接上所说和解释的那样:
多叶填充
some() 在第 5 版中被添加到 ECMA-262 标准中;因此它可能不存在于标准的所有实现中。您可以通过在您的脚本,允许在实现中使用 some() 不原生支持它。此算法正是 中指定的算法ECMA-262,第 5 版,假设对象和类型错误具有原始值和 fun.call 的计算结果为Function.prototype.call().
您应该为数组创建一个原型.some()
方法。
// Production steps of ECMA-262, Edition 5, 15.4.4.17
// Reference: http://es5.github.io/#x15.4.4.17
if (!Array.prototype.some) {
Array.prototype.some = function(fun/*, thisArg*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.some called on null or undefined');
}
if (typeof fun !== 'function') {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t && fun.call(thisArg, t[i], i, t)) {
return true;
}
}
return false;
};
}
当您定义/原型化.some()
时,您将能够在文档/范围中的任何数组上使用它,即:
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
错误消息仅显示arrayProduct['Productomschrijving']
undefined
。所以也许你有一个错别字,或者该属性根本不存在。
它是一个减少,你可以通过这样的东西获得所需的结果:
var arr = [{p: 'X', v: 50}, {p:'Y', v: 12}, {p:'X', v:80}, {p:'X', v:140}]
arr.reduce(function(acc, curr){
if (acc[curr.p]){
acc[curr.p] = acc[curr.p] + curr.v
} else {
acc[curr.p] = curr.v
}
return acc;
}, {});