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

时间:2017-12-09 06:30:29

标签: javascript reactjs

将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;

考虑Key1是第一个元素(位置+日期的组合)。如果数组中存在相同的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});
                        }
                }
        }

问题是,for循环多次迭代 - 它继续多次比较同一个元素。我该如何解决这个问题。

3 个答案:

答案 0 :(得分:3)

这似乎是一种非常适合地图的问题。你不应该在数组上循环两次。

<img>

答案 1 :(得分:1)

使用地图可以获得更易读的代码,可能是一个更高效的程序,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(function (x) {
  var label = x[0] + "-" + x[1];
  if (!map[label]) map[label] = ++n;
  return x.concat([map[label]]);
});

console.log(xs);

答案 2 :(得分:0)

如果您尝试将每个项目相互比较,那么您最内层的for循环将从错误的索引开始。目前你有

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

相反,你应该从你的外环停止的地方开始,就像这样(通过递增i)

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

希望这有帮助!

相关问题