如何在阵列NodeJS中获取唯一和最小的对象

时间:2017-08-23 20:30:37

标签: javascript node.js

我有一个对象数组,如下所示:

var array = [
   {competitor: "X", fruit: "Cherry", size: 10},
   {competitor: "X", fruit: "Banana", size: 20},
   {competitor: "Y", fruit: "Cherry", size: 5},
   {competitor: "Y", fruit: "Banana", size: 25}
]

如何根据尺寸获得最小和独特的水果,无论竞争对手的结果如何:

[
   {competitor: "X", fruit: "Banana", size: 20},
   {competitor: "Y", fruit: "Cherry", size: 5}
]

3 个答案:

答案 0 :(得分:6)

您可以使用Array.reduce根据水果名称创建哈希值,并在当前项目的size小于存储的项目size时覆盖:

const array = [
   {competitor: "X", fruit: "Cherry", size: 10},
   {competitor: "X", fruit: "Banana", size: 20},
   {competitor: "Y", fruit: "Cherry", size: 5},
   {competitor: "Y", fruit: "Banana", size: 25}
];
const result = array.reduce((p, c) => {
  if (!p[c.fruit] || c.size < p[c.fruit].size) {
    p[c.fruit] = c;
  }
  return p;
}, {});

console.log(result);

// as array
const resultArray = Object.keys(result).map(x => result[x]);

// as an array if Object.values() is available
const resultValues = Object.values(result);

console.log(resultArray)

答案 1 :(得分:1)

var array = [
   {competitor: "X", fruit: "Cherry", size: 10},
   {competitor: "X", fruit: "Banana", size: 20},
   {competitor: "Y", fruit: "Cherry", size: 5},
   {competitor: "Y", fruit: "Banana", size: 25}
];

var temp = {};
for (var i = 0; i < array.length; i++) {
    var fruit = array[i].fruit;
    var size = array[i].size;
    if (!temp[fruit] || size < temp[fruit].size) {
        temp[fruit] = array[i];
    }
}

var result = [];
for (var key in temp) {
    result.push(temp[key]);
}
console.log(result);

答案 2 :(得分:0)

您可以使用哈希表和单个循环。

var array = [{ competitor: "X", fruit: "Cherry", size: 10 }, { competitor: "X", fruit: "Banana", size: 20 }, { competitor: "Y", fruit: "Cherry", size: 5 }, { competitor: "Y", fruit: "Banana", size: 25 }],
    hash = Object.create(null),
    result = [];
    
array.forEach(function (o) {
    if (!(o.fruit in hash)) {
        hash[o.fruit] = result.push(o) - 1;
        return;
    }
    if (o.size < result[hash[o.fruit]].size) {
        result[hash[o.fruit]] = o;
    }
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }