javascript - 我怎样才能以更有效的方式减少它

标签 javascript angular typescript lodash

要求 - 在 UI( Angular 6)中显示如下内容列表,其中包括首先按最大计数排序,如果计数相同,则按字母顺序 (A-Z) 排列它们。

Aditya (4) // numbers are clickable links
Bankesh (3)
Bikaji (3)
Zebra (1)

我有一个数据如下:


thingsNames = [];


const data = [ 
  {loc: 'abs', things : ['Aditya','Bankesh'] }, 
  {loc: 'abc', things: ['Aditya','Bikaji'] }, 
  {loc: 'abz', things: ['Aditya','Bikaji'] }, 
  {loc: 'dsd', things: ['Aditya','Bankesh']}, 
  {loc: 'fre', things: ['Bankesh','Bikaji','Zebra'] } 
]

我是如何实现上述要求的:

const names = [];
_.forEach(data, (item) => {
  _.forEach(item.things, (thing) => {
    names.push(thing); //this will be in the same array.here the output is names = ['Aditya', 'Aditya',Aditya','Aditya','Bankesh','Bankesh','Bankesh','Bikaji','Bikaji','Bikaji','Zebra' ]; // it is //not arranged i just wrote it likewise.

    const toString = ([name, count]) => `${name}(${count})`;
    const entry = _.entries(_.countBy(names));
    const finalResult = _.orderBy(entry, [1, 0], ['desc', 'asc']); // sorting i have achieved here
    const result = _.map(finalResult, toString); // this create everytime a new array.
    this.thingsNames = result;
  });
});

上面代码的o/p就像数组中的Aditya(4)...,我在UI中显示如下:


    <div *ngFor = "let thingsName of thingsNames">

    {{thingsName}}          

    </div>
                   // shows as 
                  // Aditya(4)
                  // Bankesh(3)
                  // Bikaji(3)
                  // Zeebra(1) 

我面临的问题是,如果数据包含100行那么它将浪费系统中太多的内存,这不是一个好的做法, 其次,我希望计数和名称作为不同的键,以便我可以使计数可点击。

我怎样才能实现它们。

最佳答案

您无法避免重新排序条目的需要,但您可以使用 _.flatMap() 而不是嵌套的 _.forEach() 调用来重构代码,并跳过末尾多余的 _.map():

const data = [ 
  {loc: 'abs', things : ['Aditya','Bankesh'] }, 
  {loc: 'abc', things: ['Aditya','Bikaji'] }, 
  {loc: 'abz', things: ['Aditya','Bikaji'] }, 
  {loc: 'dsd', things: ['Aditya','Bankesh']}, 
  {loc: 'fre', things: ['Bankesh','Bikaji','Zebra'] } 
]

const entries = _.entries(_.countBy(_.flatMap(data, 'things')))
const thingsNames = _.orderBy(entries, [1, 0], ['desc', 'asc']);

console.log(thingsNames)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

不要映射结果,而是使用 ngFor 创建文本和链接:

<div *ngFor = "let thingsName of thingsNames">

  {{thingsName[0]}} (<a href="/url" >({{thingsName[1]}})</a>)

</div>

关于javascript - 我怎样才能以更有效的方式减少它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58988544/

相关文章:

javascript - NestJS:设置@Body()的类型

javascript - 使用 HTML、Javascript 将数据保存在本地文件中?

javascript - Firebase云函数,获取最后添加的子项

javascript - 禁用 Javascript 元素不适用于 php DOM

javascript - 如何在 jquery 函数中调用 typescript 函数?

javascript - 如何用大括号(包括子数组)包裹 json 的值?

javascript - es5 模块化设计模式到 es6

添加查询参数时,Angular 5 路由器不匹配

angular - 如何在 Angular 项目中使用新的 Cypress 组件测试运行程序?

javascript - setTimeout 在 Typescript/Angular 中的 forEach 循环中不起作用