使用自定义函数从字典创建列表/数组

时间:2014-10-04 12:27:04

标签: javascript arrays dictionary transformation

我有一个输入数组,数组的每个元素都是字典{x:a_int, y:a_int}。现在我需要提取所有y值并创建一个新数组,以便它可用于计算所有y - 值的最大值。这是我目前的代码:

var inputArray = [{x:1,y:100},{x:2,y:101},{x:3,y:103}];

function extractY(data) {
    var result = [];
    data.forEach(function (item) {
      result.push(item.y);
    });
    return result;
}

// Test code
var yArray = extractY(inputArray);
console.log(Math.max.apply(Math, yArray));

我想缩短代码。由于我是javascript的新手,我想知道,是否有可能缩短函数extractY()。我的想象力是具有转换功能。代码不应该依赖jQuery,也不必考虑旧的浏览器兼容性。

3 个答案:

答案 0 :(得分:3)

你可以简单地使用Array.prototype.map,这将创建一个新的数组,其中包含传递给它的函数返回的值,如下所示

function extractY(data) {
    return data.map(function (item) {
      return item.y;
    });
}

或者您可以简单地将其写为

console.log(Math.max.apply(Math, inputArray.map(function(item) {
    return item.y;
})));

答案 1 :(得分:3)

使用reduce,您可以直接获得最大y值:

inputArray.reduce(function(prev, curr) {
    return prev.y > curr.y ? prev : curr;
}).y

答案 2 :(得分:1)

使用下划线:

_.max(_.pick(inputArray, 'y'))

使用d3:

d3.max(inputArray, function(d) { return d.y; })

请注意@ AmitJoki的评论:是的,我知道这个问题没有被标记为下划线。如果您不想使用下划线,请随意忽略此答案。话虽如此,下划线是一个非常有用的实用工具带,非常适合解决诸如此类问题等许多其他问题。它经过了详尽的测试,强大而高效,可以正确处理所有边缘情况。与某些其他臃肿的图书馆不同,它非常轻巧,非常值得学习。

我怀疑是否属于常识领域,暗示未标记问题“强调”意味着基于下划线的答案在某种程度上是不可接受的,考虑到很容易想象在许多情况下OP可能甚至不知道这个选项,可能会欢迎有关如何编写更紧凑的代码的建议,同时在此过程中学习一个有用的工具。