javascript .some对象属性的函数

时间:2016-01-18 09:48:27

标签: javascript arrays

我有一个包含多个对象的数组,其中包含以下信息:

string ProductDescription/Name
int Amount

我想创建一个新数组,它结合了相同产品描述的数量。示例:第一个数组包含:Product X 50,Product X 80和Product X 140。

我的新阵列应该是Product 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']);

但它给出了错误......

  

未捕获的TypeError:无法读取未定义的属性“某些”

当我这样做的时候:

var found = checkAvailability(arrayProduct, javascript_array[i]['Productomschrijving']);

总是假的。有点正常,因为它将字符串与对象进行比较。

那么如何解决我的some函数正在检查对象的属性而不是整个对象?

5 个答案:

答案 0 :(得分:5)

正确的比较应为val arrVal.Productomschrijving

function checkAvailability(arr, val) {
    return arr.some(function(arrVal) {
        return val === arrVal.Productomschrijving;
    });
}

答案 1 :(得分:2)

你必须使用some()方法

为什么不简单?检查此fiddle

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 );

答案 2 :(得分:0)

错误消息仅表明arrayProduct['Productomschrijving']undefined。所以也许你有一个错字或财产不存在。

答案 3 :(得分:0)

正如它在your link上所说并解释的那样:

  

填充工具

     

在第5版的ECMA-262标准中添加了一些();因此   它可能不存在于标准的所有实现中。您可以   通过在开头插入以下代码来解决这个问题   你的脚本,允许在实现中使用some()   原生支持它。该算法正好是指定的算法   ECMA-262,第5版,假设Object和TypeError有它们的   原始值和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

答案 4 :(得分:0)

它是reduce,您可以通过以下方式获得所需的结果:

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;
  }, {});