获取一个列表中不在另一个列表中的项目列表

时间:2013-12-20 04:51:53

标签: javascript

我有两个以逗号分隔的列表,第一个是可能值列表,第二个是“选定”值列表。我需要创建第一个列表中第二个列表中不存在的所有项目的列表。

我可以将第一个列表拆分成一个数组并使用“for”通过string_pos查看列表是否包含第二个列表项,但是我想知道是否还有更多有效的方法来实现这一目标。

谢谢!

3 个答案:

答案 0 :(得分:1)

您要做的第一件事就是将两个以逗号分隔的列表拆分为字符串数组。假设它们的格式相当合理,您可以使用

执行此操作
possible_values = possible_string.split(/,\s?/) //split on commas with a possible space
selected_values = selected_string.split(/,\s?/)

如果您愿意使用外部库,underscore.js具有完美的功能。您描述的操作是设置差异运算符,它是下划线中的difference function

您想要的结果是调用

的返回值
_.difference(possible_values, selected_values)

答案 1 :(得分:1)

如果您正在寻找最佳方式,这就是您必须做的事情

  1. 在班轮时间内将要检查的列表转换为对象。因为,对象在技术上是哈希表,它提供更快的查找O(1))。

  2. 然后,迭代第一个列表并检查对象中是否存在当前元素。如果不存在,请将其添加到结果中。

    var list1 = [1, 2, 3], list2 = [1, 2], dict2 = {};
    
    list2.forEach(function(item) {
        dict2[item] = true;
    });
    
    var result = list1.reduce(function(prev, current) {
        if (dict2.hasOwnProperty(current) === false) {
            prev.push(current);
        }
        return prev;
    }, [])
    
    
    console.log(result);
    
  3. <强>输出

    [ 3 ]
    

答案 2 :(得分:1)

您可以过滤可能的列表。

如果列表是字符串,则拆分或匹配它们以获取数组。

var possible=[1,2,3,4],
selected=[2,4];

var unchosen=possible.filter(function(itm){
  return selected.indexOf(itm)==-1;
});

unchosen

/*  returned value: (Array)
1,3
*/