Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript数组-将元素与同一数组中的其他元素进行比较_Javascript_Reactjs - Fatal编程技术网

javascript数组-将元素与同一数组中的其他元素进行比较

javascript数组-将元素与同一数组中的其他元素进行比较,javascript,reactjs,Javascript,Reactjs,我将javascript元素数组与同一数组中的其他元素进行比较。如果元素是相同的意思,我必须给所有公共元素相同的数字。如果元素不同,我必须为另一个元素中的所有不相同元素提供不同的编号 例如: Array structure = [{Location, Date, Number}] array = [{ 'LA','2017-12-01',1}, { 'LA','2017-12-01',1}, { 'NY','2017-12-01',2},

我将javascript元素数组与同一数组中的其他元素进行比较。如果元素是相同的意思,我必须给所有公共元素相同的数字。如果元素不同,我必须为另一个元素中的所有不相同元素提供不同的编号

例如:

Array structure = [{Location, Date, Number}]


array = [{ 'LA','2017-12-01',1},
         { 'LA','2017-12-01',1},
         { 'NY','2017-12-01',2},
         { 'NY','2016-10-01',3},
         { 'LA','2017-12-01',1},
         { 'LA','2017-12-01',1},
         { 'LA','2017-12-01',1}]
在这个数组中,“Number”是动态元素,应该按照以下规则填充它

key1 = location + '-' +date;
考虑键1是第一个元素(位置+日期的组合)。如果数组中存在相同的key1,则“Number”对于所有相同的key1都是通用的

在上述示例中,
{'LA','2017-12-01',1}
具有相同的编号
1

{'NY','2017-12-01',2}
具有编号
2
。及
{'NY','2016-10-01',3},
具有编号
3
,因为尽管位置常见,但日期不同

请在下面找到我的代码

var item = this.state.item;
var lines = item.order_items;
var count=1;
var key1;
var key2;

    for(var i=0;i<lines.length;i++)
        {
            key1 = lines[i].location + '-' + lines[i].date;

            for(var j=0;j<lines.length;j++)
                {
                    key2 = lines[j].location + '-' + lines[j].date;
                    if( key1 === key2 )
                        {
                            lines[i].number=count;
                            this.setState({item:item});
                        }
                    else
                        {
                            count++;
                            lines[j].number=count;
                            this.setState({item:item});
                        }
                }
        }
var item=this.state.item;
变量行=项目。订单\项目;
var计数=1;
var-key1;
var-key2;

对于(var i=0;i如果您试图将每个项相互比较,则最内层的for循环从错误的索引开始

for(var j=0;j<lines.length;j++)

for(var j=0;j这似乎是一个非常适合映射的问题。您不应该在数组上循环两次

var item = this.state.item;
var lines = item.order_items;
var map = new Map();
for (var i = 0; i < lines.length; i++) {
    key = lines[i].location + '-' + lines[i].date;
    if (!map.has(key)) {
        map.set(key, map.size + 1);
    }
    lines[i].number = map.get(key);
    this.setState({item: item});
}
var item=this.state.item;
变量行=项目。订单\项目;
var map=newmap();
对于(变量i=0;i
使用映射,您可以获得更可读的代码,可能是更高效的程序,O(n²)到O(n),假设访问映射的时间是恒定的:

var n=0;
var-map={};
var xs=[
['LA','2017-12-01'],
['LA','2017-12-01'],
['NY','2017-12-01'],
['NY','2016-10-01'],
['LA','2017-12-01'],
['LA','2017-12-01'],
['LA','2017-12-01']
];
xs=xs.map(函数(x){
变量标签=x[0]+“-”+x[1];
如果(!map[label])map[label]=++n;
返回x.concat([map[label]]);
});

console.log(xs);
do
jThanks很多,它工作得很好。这里还有一个例子——有时
lines[i]。date
不可用,在这种情况下,我必须检查另一个字段
lines[i]。manufacture\u date
如何检查另一个元素。例如:
key=lines[i]。location+'-+lines[i]。date?lines[i].date:lines[i]。manufacturing_date;
像这样…?为了回答您的问题,我需要您澄清:如果第[i].date行不存在,但是第[i]行。manufacturing_date与另一行的日期匹配,它们是否仍被视为匹配键?例如,如果我们有两个{LA',2017-12-01'}实例,但如果输出为[{'LA',2017-12-01',1},{'LA',2017-12-01',1},{'LA',2017-12-01',1}]或[{'LA',2017-12-01',1},{'LA',2017-12-01',1},{'LA',2017-12-01',2}],则其中一个日期为'2017-12-01'我将用另一种方式解释:<代码>键=行。位置+线。日期/代码>。我希望你明白我的意思。如果<代码>行。日期<代码>不存在,那么它应该考虑<代码>行。e来自。如果两行的位置相同,则第2行没有日期,第1行的日期等于第2行的制造日期,输出结果是什么?它们是否具有相同的编号?好的,谢谢。将第5行替换为var key=lines[i]。location+'-'+(lines[i]。date?lines[i]。日期:lines[i]。manufacture\u date);
var item = this.state.item;
var lines = item.order_items;
var map = new Map();
for (var i = 0; i < lines.length; i++) {
    key = lines[i].location + '-' + lines[i].date;
    if (!map.has(key)) {
        map.set(key, map.size + 1);
    }
    lines[i].number = map.get(key);
    this.setState({item: item});
}