首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构这段代码?我有3个标签需要在列表中重新选择

如何重构这段代码?我有3个标签需要在列表中重新选择
EN

Stack Overflow用户
提问于 2016-02-09 17:04:41
回答 3查看 29关注 0票数 0
代码语言:javascript
复制
for (var i=0; i<vm.tags.length; i++) {
    if (selectedTags[0]) {
        if (vm.tags[i].term_id === selectedTags[0].term_id) {
            vm.tags[i].border1 = true;
        }
    }

    if (selectedTags[1]) {
        if (vm.tags[i].term_id === selectedTags[1].term_id) {
            vm.tags[i].border2 = true;
        }
    }

    if (selectedTags[2]) {
        if (vm.tags[i].term_id === selectedTags[2].term_id) {
            vm.tags[i].border3 = true;
        }
    }
}

vm.tags是完整的列表,直到20+标记。selectedTags是一个数组,它最多包含3个标签,基本上是3个标签,它们可能包含与vm.tags中的标签相同的ids。

如果vm.tags中的标记与来自selectedTag的标记匹配,则需要更改这些vm.tags的边框值。

有比上面更好的方法来完成这个任务吗?在那里我有重复的代码。

selectedTags数组示例:

[object, object, object]

数组中的对象示例:

代码语言:javascript
复制
{
    selected: true,
    term: "term_name",
    term_id: 2349506
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-09 17:10:40

检查一下这个:

代码语言:javascript
复制
for (var i=0; i<vm.tags.length; i++) {
  for(var j=0; j<selectedTags.length; j++){
    if(selectedTags[j].term_id === vm.tags[i].term_id ){
      var name = 'border'+ ( j + 1 );  
      vm.tags[i][name] = true;
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2016-02-09 17:14:41

如果您可以将使用border1border2border3的方式更改为数组,则可以通过遍历vm.tags来实现这一点,而对于每个vm.tags,则可以在selectedTags上循环并比较If。有匹配时,可以将selectedTags迭代器的值推到borders数组中。这看起来应该是:

代码语言:javascript
复制
for (var i=0; i<vm.tags.length; i++) {
    for(var j=0; j<selectedTags.length; j++) {
            if(selectedTags[j].term_id === vm.tags[i]) {
            // make sure the array exists before pushing to it
            vm.tags[i].borders = vm.tags[i].borders || [];
            vm.tags[i].borders.push(j);
        }
    };
};

当然,这取决于您是否可以将对border1border2border3的使用重构为一个可以具有任何[0, 1, 2]组合的数组。

我建议这样做,因为在这样的数据结构中使用编号值会很快变得难以处理。

票数 0
EN

Stack Overflow用户

发布于 2016-02-09 17:32:45

下面是一个示例,它使用javascript数组映射和筛选函数来完成相同的任务,可能不太容易读,但这是另一种选择:

代码语言:javascript
复制
var addBorders = vm.tags.map(function(obj, k) {
  if (selectedTags.filter(function(o) { return o.term_id === obj.term_id; }).length)
    obj['border' + (k + 1)] = true;

  return obj;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35297880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档