javascript数组

时间:2017-08-18 01:42:30

标签: javascript arrays

查找唯一文件名的计数包含在一个简单的javascript数组中。

我有一个javascript数组,它通过

组合了两个数组
var total_dl = prev_dl.concat(new_dl).sort();

一个是来自php变量的json_encode(),另一个来自在表单上选择的复选框值。这会输出一个简单的文件名列表,即

    cat.jpg, dog.jpg, elephant.jpg, cat.jpg, lion.jpg, dog.jpg 

然后我可以使用

将其细化为不同值的数组
var unique_dl = total_dl.filter((value,pos) => {return total_dl.indexOf(value) == pos;} );  

输出

    cat.jpg, dog.jpg, elephant.jpg, lion.jpg

我现在只需要输出这里包含多少个唯一/不同文件名的计数,即4.首先想到的是使用长度

var count_unique = unique_dl.length; 

似乎给出了prev_dl + 1的值,对于new_dl组成的内容没有变化。另一个尝试

var count_unique = unique_dl.filter(function(val, i, arr) { 
    return arr.indexOf(val) === i;
}).length;

也失败了(我在这里错误格式化了吗?)。

非常欢迎任何指点/指导者,谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用Set对象。它需要一个可迭代的并返回一个包含唯一项的集合。

const arr = 'cat.jpg, dog.jpg, elephant.jpg, cat.jpg, lion.jpg, dog.jpg'.split(', ');
const unique = new Set(arr);

console.log(unique.size);

如果您想将其转换回数组,可以使用Array.from

const uniqueArr = Array.from(unique);

console.log(uniqueArr);



const arr = 'cat.jpg, dog.jpg, elephant.jpg, cat.jpg, lion.jpg, dog.jpg'.split(', ');
const unique = new Set(arr);

console.log('Set size', unique.size);

const uniqueArr = Array.from(unique);

console.log('Unique array', uniqueArr);




答案 1 :(得分:0)

unique_dl.length解决方案适合我。 建立unique_dl你需要O(n ^ 2)时间,所以它比:

function count_unique(in_array) {
    if(in_array.length == 0)
        return 0;
    var sorted = input_array.sort();
    var unique_count = 1;
    for(int i = 1; i < sorted.length; ++i)
        if(sorted[i - 1] != sorted[i])
            ++unique_count;
    return unique_count;
 }

因为它只使用O(n log(n))时间

答案 2 :(得分:0)

我测试了你的例子,正如@phil所说,你提供的数据结果是4。

var total_dl = [
  'cat.jpg', 'dog.jpg', 'elephant.jpg', 'cat.jpg',
  'lion.jpg', 'dog.jpg'
]
var unique_dl = total_dl.filter((value,pos) => {return total_dl.indexOf(value) == pos;} );  

console.log(unique_dl)
var count_unique = unique_dl.length; 
console.log(count_unique)

https://jsbin.com/rolaxuh/1/edit?html,js,console