簡體   English   中英

計算數組中多個對象的屬性

[英]Count properties of multiple objects in array

我想計算多對象數組中的元素。 我該怎么做?

//constructor function
function Bookdes(title, author, pages, current_page, available){
    this.title = title;
    this.author = author;
    this.pages = pages;
    this.current_page = current_page;
    this.available = available;
}
//array of books
var bookarrays = [
    new Bookdes("Fast Cars", "John Burns", 205, 43, "true"),
    new Bookdes("Slow Cars", "Joe Fast", 70, 32, "false" ),
    new Bookdes("Big Cars", "Darla Jean", 234, 42, "true"),
    new Bookdes("Small Cars", "Dema Jones", 214, 34, "false"),
    new Bookdes("Cars", "Alex Best", 235, 41, "true")
];

現在如何計算可用書籍(true),總閱讀頁數(current_page),最長標題的長度?

謝謝,

函數式編程技術乍一看似乎有些強悍,但通常會使這種問題變得更簡單。 使用Ramda (公開:我是作者之一;但是這些技術在許多其他函數式編程庫中都可用),您可以執行以下操作:

var countAvailable = R.pipe(R.filter(R.propEq('available', 'true')), R.prop('length'));
var pagesRead = R.pipe(R.pluck('current_page'), R.sum);
var maxTitleLength = R.pipe(R.pluck('title'), R.pluck('length'), R.max);

每個函數都返回一個可以使用bookarrays調用的bookarrays 您可以在Ramda REPL上看到它的運行情況。

要點是,像pluck這樣的常用功能使您有機pluck一個列表更改為另一個列表。 所以

pluck('title')(bookarrays);
//=> ["Fast Cars", "Slow Cars", "Big Cars", "Small Cars", "Cars"]

然后,您將獲得一個更簡單的列表以進行進一步操作。 如果在上面調用pluck('length') ,則得到[9. 9, 8, 10, 4] [9. 9, 8, 10, 4] ,然后您可以調用max 因此,只需使用pluckmax並將它們通過pipe maxTitleLength在一起,就可以非常輕松地創建函數maxTitleLength 函數式編程可以做很多事情:創建可用於相同數據結構(在這種情況下為列表)的簡單可組合函數


更新資料

所有這些的重點不是庫本身。 這個想法是,如果您制作許多小的,可重用的,可組合的部分,則可以從中構建更復雜的功能。 這是這樣的功能集合的開始,足以解決這些問題:

var add = function(a, b) {
  return a + b;
};

var sum = function(list) {
  return list.reduce(add, 0);
};

var max = function(list) {
  return Math.max.apply(Math, list);
};

var map = function(fn) {
  return function(list) {
    return list.map(fn);
  };
};

var prop = function(name) {
  return function(obj) {
    return obj[name];
  };
};

var pipe = function() {
    var funcs = arguments;
    return function() {
        var args = arguments;
        for (var i = 0; i < funcs.length; i++) {
            args = [funcs[i].apply(this, args)];
        }
        return args[0];
    };
};

var pluck = pipe(prop, map);

var filter = function(fn) {
  return function(list) {
    return list.filter(fn);
  };
};

var propEq = function(name, val) {
  return function(obj) {
    return obj[name] === val;
  };
}

要使用這個小庫,您可以通過合並它們來編寫代碼。 注意pluck的定義有多簡單。

您也可以這樣寫:

var pluck = function(name) {
  return map(prop(name));
};

但是由於pipe句柄以這種方式組合功能,我們可以簡單地編寫

var pluck = pipe(prop, map);

顯然,使用這些功能,然后可以為您的答案編寫函數,如下所示:

var countAvailable = pipe(filter(propEq('available', 'true')), prop('length'));
var pagesRead = pipe(pluck('current_page'), sum);
var maxTitleLength = pipe(pluck('title'), pluck('length'), max);

countAvailable(bookarrays); //=> 3
pagesRead(bookarrays);      //=> 192
maxTitleLength(bookarrays); //=> 10

當然,這不是完成這樣的任務的最簡單方法。 但是現在您可以使用所有這些功能,並且進一步的任務會更容易。 這就是函數式編程的目的。


這跳過了函數編程中的一個重要工具currying 休·傑克遜(Hugh Jackson)撰寫了一篇很棒的主題文章,而我寫了 一篇文章 ,提供了更多細節。 我不會在這里詳細介紹,但這會使這些功能更簡單。 例如,代替

var propEq = function(name, val) {
  return function(obj) {
    return obj[name] === val;
  };
}

我們可以寫

var propEq = curry(function(name, val, obj) {
  return obj[name] === val;
});

並且您可以像上面那樣調用它,只傳遞nameval來返回一個使用obj的函數。 或者,您可以立即傳遞所有三個參數:

propEq('length', 3, 'abc'); //=> true

使用curry函數可以進一步簡化上述代碼,同時使其更加靈活。

檢查這個小提琴以進行現場演示

//constructor function
function Bookdes(title, author, pages, current_page, available){
    this.title = title;
    this.author = author;
    this.pages = pages;
    this.current_page = current_page;
    this.available = available;
}
//array of books
var bookarrays = [
    new Bookdes("Fast Cars", "John Burns", 205, 43, "true"),
    new Bookdes("Slow Cars", "Joe Fast", 70, 32, "false" ),
    new Bookdes("Big Cars", "Darla Jean", 234, 42, "true"),
    new Bookdes("Small Cars", "Dema Jones", 214, 34, "false"),
    new Bookdes("Cars", "Alex Best", 235, 41, "true")
];

function sum(){
   var i;
    var count = 0;
    var maxlen = 0;
    var read = 0;
    for(i=0; i<bookarrays.length; i++){
        if(bookarrays[i].title.length > maxlen){
             maxlen = bookarrays[i].title.length;
        }
        if(bookarrays[i].available === "true" || bookarrays[i].available === true){
             count++;   
        }
        read += bookarrays[i].current_page;

    }
    $("#out").html("Count: " + count + "<br>Maxlength: " + maxlen + "<br>read: " + read);
}

$(function(){
       sum();
});

和一些HTML:

<div id="out"></div>

它打印:

Count: 3
Maxlength: 10
read: 192

只需遍歷每個元素,然后做您想做的事

現場演示

//constructor function
function Bookdes(title, author, pages, current_page, available){
    this.title = title;
    this.author = author;
    this.pages = pages;
    this.current_page = current_page;
    this.available = available === 'true';
}
//array of books
var bookarrays = [
    new Bookdes("Fast Cars", "John Burns", 205, 43, "true"),
    new Bookdes("Slow Cars", "Joe Fast", 70, 32, "false" ),
    new Bookdes("Big Cars", "Darla Jean", 234, 42, "true"),
    new Bookdes("Small Cars", "Dema Jones", 214, 34, "false"),
    new Bookdes("Cars", "Alex Best", 235, 41, "true")
];

var available = 0;
var page = 0;
var longest = '';

for (var i = 0, max = bookarrays.length; i < max; i += 1) {
    bookarrays[i].available && (available += 1);
    page += bookarrays[i].current_page;
    longest = bookarrays[i].title.length > longest.length ? bookarrays[i].title : longest;
}

alert(available);
alert(page);
alert(longest);

暫無
暫無

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

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