-1

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"}
]
  • How are you going to decide which to choose when you have multiple objects with the same name? – Nick Nov 24 '21 at 20:45
  • like this: (name == (name || null)) && (age == (age || null)) && (date == (date || null)) && (home == (home || null)) – Francisco Dias Nov 24 '21 at 20:52
  • Does this answer your question? [How to remove all duplicates from an array of objects?](https://stackoverflow.com/questions/2218999/how-to-remove-all-duplicates-from-an-array-of-objects) – pilchard Nov 24 '21 at 21:23

3 Answers3

1

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]
Tim Jensen
  • 74
  • 3
1

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.

Arfa
  • 105
  • 9
  • In case of array methods, [filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) would work better, since it will return new filtered array with no need to create and fill it manually. – Mr. Hedgehog Nov 24 '21 at 21:20
0

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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
  • I haven't tested your solution but guess that it is working. Well done! The variety of variables does make this a fairly complex matter - hence the layering of your if, else, else if... Interesting that you have reconfigured your array. This is the value of trying a solution against your own question - sometimes rephrasing the question leads to an answer. Perhaps part of your solution could be better filtering at the input stage? See you around here some more :) – Arfa Nov 25 '21 at 17:55