简体   繁体   中英

How to get distinct values from array in JavaScript?

Assuming I have the following:

var array =

[
    {"name":"Joe", "age":null, "date":"1959-08-10", "home":"ny"}
],
[
    {"name":"Bill", "age":null, "date":"1956-08-10", "home":"tx"}
],
[
    {"name":"Joe", "age":"17", "date":null, "home":"ny"}
],
[
    {"name":null, "age":"17", "date":"1956-08-10", "home":"tx"}
],
[
    {"name":"Joe", "age":"17", "date":"1959-08-10", "home":null}
]

What is the best way to be able to get an new array:

var new_array =

[
    {"name":"Joe", "age":"17", "date":"1959-08-10", "home":"ny"}
],
[
    {"name":"Bill", "age":"17", "date":"1956-08-10", "home":"tx"}
]

There are basically four options available to you: A regular loop, or the map, filter, reduce functions on the array instance, for example:

var oldArray = [1, 2, 3, 4, 5];
var newArray = oldArray.filter((item) => item > 2); // Gives you [3, 4, 5] 

Have a look at mdn for a more specific description. This link is to filter, but map and reduce can be found in the left sidepanel.

Edit The loop method:

var oldArray = [1, 2, 3, 4, 5];
var newArray = [];

for (var item of oldArray) {
  if (item > 2) {
    newArray.push(item);
  }
}
newArray; // Gives you [3, 4, 5]

Bill and Joe are the reference points.
You need to loop through the array and test for name and store (in another array) non-null values.
Also, are there only two names?
You probably need to allow for a variable number of names.
this is far from complete code but will hopefully get you started.
Also look at foreach
You need to at least show what you have tried to make discussion and debug easier!

var dataCollect=[];
for (i=0; i<array.length; i++) {    
    if (array[i]['name'] != null) { name = array[i]['name'];
    /* then your range of qualifiers gets complicated
eg. array[3] has no name so how to know what this relates to?
you probably need another internal loop to test !=null
to get values for x y z */
    dataCollect.push ({
name: name,
age: 'x',
date: 'y',
home: 'z'
    });
}

Please offer some code to show how you have tried to work with this.

Assuming I have the following:

var array =

[
    {"numberUnique1":"123456789", "numberUnique2":null, "name":null, "date":"1959-08-10", "kinship":null}
],
[
    {"numberUnique1":"987654123", "numberUnique2":"15935478", "name":"Joe", "date":null, "kinship":null}
],
[
    {"numberUnique1":"123456789", "numberUnique2":"258369147", "name":null, "date":"1959-08-10", "kinship":null}
],
[
    {"numberUnique1":null, "numberUnique2":"15935478", "name":null, "date":"1976-09-14", "kinship":"dad"}
],
[
    {"numberUnique1":"123456789", "numberUnique2":null, "name":"Bill", "date":"1959-08-10", "kinship":"son"}
]

What is the best way to be able to get an new array:

var new_array =

[
    {"numberUnique1":"123456789", "numberUnique2":258369147, "name":"Bill", "date":"1959-08-10", "kinship":"son"}
],
[
    {"numberUnique1":"987654123", "numberUnique2":"15935478", "name":"Joe", "date":"1976-09-14", "kinship":"dad"}
]

It was solved like this (I don't know if there is a better way):

new_array = [];
if (array.length > 0) {
    new_array.push(array[0]);
    let aux = 1;
    let qtd = 0;
    m:for (var i = 1; i < array.length; i++) {
        for (var ii = 0; ii < aux; ii++) {
            if ( (new_array[ii].numberUnique1 != array[i].numberUnique1) && (!!new_array[ii].numberUnique1) && (!!array[i].numberUnique1) ) {
                for (var iii = 0; iii < new_array.length; iii++) {
                    if (new_array[iii].numberUnique1 == array[i].numberUnique1) {
                        qtd = qtd + 1;
                    }
                }
                if (qtd == 0) {    
                    new_array.push(array[i]);
                    if ( (new_array.length < array.length) ) {
                        aux = aux + 1;
                        continue m;
                    }
                }
            } else if ( (new_array[ii].numberUnique1 == array[i].numberUnique1) && (!!new_array[ii].numberUnique1) && (!!array[i].numberUnique1) ) {
                if ( (!new_array[ii].numberUnique2) &&  (!!array[i].numberUnique2) ) {
                    new_array[ii].numberUnique2 = array[i].numberUnique2;
                }
                if ( (!new_array[ii].name) &&  (!!array[i].name) ) {
                    new_array[ii].name = array[i].name;
                }
                if ( (!new_array[ii].date) &&  (!!array[i].date) ) {
                    new_array[ii].date = array[i].date;
                }
                if ( (!new_array[ii].kinship) &&  (!!array[i].kinship) ) {
                    new_array[ii].kinship = array[i].kinship;
                }
            } else {
                if ( (new_array[ii].numberUnique2 != array[i].numberUnique2) && (!!new_array[ii].numberUnique2) && (!!array[i].numberUnique2) ) {
                    for (var iii = 0; iii < new_array.length; iii++) {
                        if (new_array[iii].numberUnique2 == array[i].numberUnique2) {
                            qtd = qtd + 1;
                        }
                    }
                    if (qtd == 0) {    
                        new_array.push(array[i]);
                        if ( (new_array.length < array.length) ) {
                            aux = aux + 1;
                            continue m;
                        }
                    }
                } else if ( (new_array[ii].numberUnique2 == array[i].numberUnique2) && (!!new_array[ii].numberUnique2) && (!!array[i].numberUnique2) ) {
                    if ( (!new_array[ii].numberUnique1) &&  (!!array[i].numberUnique1) ) {
                        new_array[ii].numberUnique1 = array[i].numberUnique1;
                    }
                    if ( (!new_array[ii].name) &&  (!!array[i].name) ) {
                        new_array[ii].name = array[i].name;
                    }
                    if ( (!new_array[ii].date) &&  (!!array[i].date) ) {
                        new_array[ii].date = array[i].date;
                    }
                    if ( (!new_array[ii].kinship) &&  (!!array[i].kinship) ) {
                        new_array[ii].kinship = array[i].kinship;
                    }
                } else {
                    if ( (new_array[ii].name != array[i].name) && (!!new_array[ii].name) && (!!array[i].name) ) {
                        for (var iii = 0; iii < new_array.length; iii++) {
                            if (new_array[iii].name == array[i].name) {
                                qtd = qtd + 1;
                            }
                        }
                        if (qtd == 0) {    
                            new_array.push(array[i]);
                            if ( (new_array.length < array.length) ) {
                                aux = aux + 1;
                                continue m;
                            }
                        }
                    } else if ( (new_array[ii].name == array[i].name) && (!!new_array[ii].name) && (!!array[i].name) ) {
                        if ( (new_array[ii].date == array[i].date) && (!!new_array[ii].date) && (!!array[i].date) ) {
                            if ( (new_array[ii].kinship == array[i].kinship) && (!!new_array[ii].kinship) && (!!array[i].kinship) ) {
                                if ( (!new_array[ii].numberUnique1) &&  (!!array[i].numberUnique1) ) {
                                    new_array[ii].numberUnique1 = array[i].numberUnique1;
                                }
                                if ( (!new_array[ii].numberUnique2) &&  (!!array[i].numberUnique2) ) {
                                    new_array[ii].numberUnique2 = array[i].numberUnique2;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM