简体   繁体   English

如何从 JavaScript 中的数组中获取不同的值?

[英]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 = 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:基本上有四个选项可供您使用:常规循环或 map、过滤器、数组实例上的归约函数,例如:

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.查看mdn以获得更具体的描述。 This link is to filter, but map and reduce can be found in the left sidepanel.此链接用于过滤,但 map 和 reduce 可以在左侧面板中找到。

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也看看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 = 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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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