Javascript / ES6找到唯一的元素并在数组中计算它们

时间:2017-02-27 08:24:24

标签: javascript arrays

拿出一系列虚构的商品,我们奇怪地只对商品名称和价值感兴趣:

let items = [
    { title: "Trumping the Horns", value: 5.95 },
    { title: "Rocking about", value: 20.00 },
    { title: "Trumping the Horns", value: 5.95 }
]

我知道我可以很容易地得到一个具有唯一值的数组:

const uniqueSales = [...new Set(items.map(item => item.title))];

但是比如说我想知道我卖的每件商品有多少,或者它们的累计价值?所以:

[
    { title: "Trumping the Horns", amount: 2 },
    { title: "Rocking about", amount: 1 }
]

是否可以映射这些,而不必对该数组进行一些疯狂的排序和迭代?优选在一个班轮。不做服务器端的主要原因是我对相同数据进行了大量不同的操作,并且发送一次并让客户端处理数据的操作和表示似乎是最正确的。

6 个答案:

答案 0 :(得分:6)

您可以使用Map并将引用存储到结果数组的新插入对象中。

@org.junit.Rule
public final ProvideSystemProperty property1 = new ProvideSystemProperty("MoreEuro", "You need more: 0.5 euro");

@org.junit.Test
public void testCountMoneyForCupSize() {
    System.out.println("---------------- Count Money For Cup Size -----------------");
    double largePrice = 1.5;
    double mediumPrice = 1;
    double smallPrice = 0.75;

    try {
        when(machineSpy.insertCash()).thenReturn(1.0);
        assertEquals(machineSpy.countMoneyForCupSize(largePrice), System.getProperty("MoreEuro"));

    } catch (InvalidCoinException e) {
        System.out.println(e.getMessage());
    }
} 

答案 1 :(得分:2)



let items = [{
    title: "Trumping the Horns",
    value: 5.95
  },
  {
    title: "Rocking about",
    value: 20.00
  },
  {
    title: "Trumping the Horns",
    value: 5.95
  }
];

console.log(items.reduce(function(countMap, item) {
  countMap[item.title] = ++countMap[item.title] || 1;
  return countMap;
}, {}));




答案 2 :(得分:1)

鉴于您最终想要的格式,我认为它比使用Map构建具有titleamount的对象要短得多,然后抓住Map的值:



const items = [
    { title: "Trumping the Horns", value: 5.95 },
    { title: "Rocking about", value: 20.00 },
    { title: "Trumping the Horns", value: 5.95 }
];
const map = new Map();
items.forEach(item => {
  const entry = map.get(item.title);
  if (!entry) {
    map.set(item.title, {title: item.title, amount: 1});
  } else {
    ++entry.amount;
  }
});
const uniqueSales = [...map.values()];
console.log(uniqueSales);




  

...最好是单行......

上述内容可以用较少的线条,但它不会提高速度,可读性或可维护性。恰恰相反。

答案 3 :(得分:0)

我会使用地图而不是数组来存储您的商品,其中地图的键应该是商品的标题,而值应该是已售商品的数量。每次,在向地图添加新项目之前,您应该检查该密钥是否已经存在,如果存在,则增加数量,否则将新的键值对添加到地图中。

答案 4 :(得分:0)

 let array = [{title:"123"}, {title: "234"}, {title: "123"}]
 let sum = array.reduce((results, item, index) => {
                      let totalItem = results.find((element) =>
                            element.title == item.title)
                      if(totalItem){
                        totalItem.count += 1
                      }else {
                         results.push(Object.assign(item, {
                              count: 1
                            }))
                      }
                       return results
                     }, [])

使用array reduce生成新数组

答案 5 :(得分:0)

在ES6中,我们可以从下面的一行代码中获得返回的唯一项,

Set<Integer> counts = new HashSet<>();
counts.addAll(hash.values());
return counts.size() == hash.keySet().size();
相关问题