使用lodash或underscorejs查找数组字段总和

时间:2015-06-19 05:29:24

标签: javascript arrays underscore.js

我要求找到" count"的总和。每个"类型"的字段。 有没有办法使用lodash或下划线js做同样的事情。 非常感谢您的帮助。谢谢。

输入数组

struct BuiltinTests {
    pwd: PathBuf
}

impl TestFixture for BuiltinTests {
    fn setup(&mut self) {
        let mut pwd = env::temp_dir();
        pwd.push("pwd");

        fs::create_dir(&pwd);
        self.pwd = pwd;
    }

    fn teardown(&mut self) {
        fs::remove_dir(&self.pwd);
    }

    fn tests(&mut self) -> Vec<Box<Fn(&mut BuiltinTests)>> {
        vec![Box::new(BuiltinTests::cd_with_no_args)]
    }
}

impl BuiltinTests {
    fn new() -> BuiltinTests {
        BuiltinTests {
            pwd: PathBuf::new()
        }
    }
}

fn cd_with_no_args(&mut self) {
    let home = String::from("/");
    env::set_var("HOME", &home);

    let mut cd = Cd::new();
    cd.run(&[]);

    assert_eq!(env::var("PWD"), Ok(home));
}

#[test]
fn cd_tests() {
    let mut builtin_tests = BuiltinTests::new();
    test_fixture_runner(&mut builtin_tests);
}

预期输出

array = [
    {
        type: 'weibo',
        count: 1
    },
    {
        type: 'xing',
        count: 1
    },
    {
        type: 'twitter',
        count: 1
    },
    {
        type: 'twitter',
        count: 1
    },
    {
        type: 'facebook',
        count: 1
    },
    {
        type: 'facebook',
        count: 1
    },
    {
        type: 'facebook',
        count: 1
    }
]

2 个答案:

答案 0 :(得分:2)

您可以使用_.countBy()_.map()执行此操作;请注意,由于中途转换为对象,输出数组的顺序可能不同。

var array = [
    {
        type: 'weibo',
        count: 1
    },
    {
        type: 'xing',
        count: 1
    },
    {
        type: 'twitter',
        count: 1
    },
    {
        type: 'twitter',
        count: 1
    },
    {
        type: 'facebook',
        count: 1
    },
    {
        type: 'facebook',
        count: 1
    },
    {
        type: 'facebook',
        count: 1
    }
  ];

console.log(_.map(_.countBy(array, 'type'), function(value, key) {
  return {
    type: key,
    count: value
  };
}));
<script src="http://underscorejs.org/underscore.js"></script>

答案 1 :(得分:0)

您可以使用_.reduce_.values一次性完成(通常情况下):

var sums = _(array).reduce(function(memo, e) {
    if(!memo[e.type])
        memo[e.type] = { type: e.type, count: 0 };
    memo[e.type].count += 1;
    return memo;
}, { });
var what_you_want = _(sums).values();

或者,如果您想跳过_.values调用,您可以跟踪对象(按类型索引)和数组(您实际执行的内容)中正在进行的总和并共享{{1它们之间的引用:

{type: ..., count: ...}

后一种方法保证输出顺序与输入顺序匹配。

演示:https://jsfiddle.net/ambiguous/hgnz04bd/