簡體   English   中英

javascript .some對象屬性的函數

[英]javascript .some function for object property

我有一個包含多個對象的數組,其中包含以下信息:

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:無法讀取未定義的屬性'some'

當我這樣做時:

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

這總是錯誤的。 有點正常,因為它將字符串與對象進行比較。

那么如何才能解決這個問題,我的some函數正在檢查對象的屬性而不是整個對象?

正確的比較應該是valarrVal.Productomschrijving

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

錯誤消息僅表示arrayProduct['Productomschrijving'] undefined 所以也許你有一個錯字或財產不存在。

正如您所說,並在您的鏈接上解釋:

填充工具

some()被添加到第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

它是一個減少 ,你可以用這樣的東西獲得所需的結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM