在JavaScript中将数组与对象数组进行比较

时间:2014-12-05 09:11:40

标签: javascript arrays data-structures

我是JavaScript的新手,想知道如何将数组与另一个数组进行比较,包含JavaScript对象。

  1. 数组是一系列以“YYYY-MM-DD”格式排序的时间。
  2. 对象数组错过了几天的价格值。
  3. 我想找到错过的值并将其指定为“NULL”。
  4. 例如,我有一个数组:

    array = ['2014-10-09','2014-10-10','2014-10-11','2014-10-12'];
    

    和一个对象为:

    的数组
    objArray = [{
        date:"2014-10-09",
        price:"100"
    },
    {
        date:"2014-10-10",
        price:"99"
    },
    {
        date:"2014-10-12",
        price:"102"
    }];
    

    我想以这种方式获得价格数组:

    priceResult = [100, 99, "NULL", 102];
    

    如果不使用其他库,最有效的方法是什么?我想看看是否有人有更优雅的解决方案。我非常感谢你的帮助。

9 个答案:

答案 0 :(得分:1)

您可以从对象数组创建查找集,然后可以使用它将日期转换为价格。

这可以很好地扩展,因为它是一个O(n + m)解决方案,而不是你在循环中使用循环来查找价格时得到的O(n * m)解决方案。



var array = ['2014-10-09','2014-10-10','2014-10-11','2014-10-12'];
var objArray = [{ date:"2014-10-09", model:"A", price:"100" },{ date:"2014-10-10", model:"A", price:"99" },{ date:"2014-10-12", model:"A", price:"102" }];

var lookup = {};
for (var i = 0; i < objArray.length; i++) {
  lookup[objArray[i].date] = parseInt(objArray[i].price, 10);
}

var priceResult = [];
for (var i = 0; i < array.length; i++) {
  if (lookup.hasOwnProperty(array[i])) {
    priceResult.push(lookup[array[i]]);
  } else {
    priceResult.push('NULL');
  }
}

// output result in StackOverflow snippet
document.write(JSON.stringify(priceResult));
&#13;
&#13;
&#13;

注意:您可能希望使用值'NULL'代替字符串null,因为它通常更容易处理。

答案 1 :(得分:0)

(我将调用您的第一个数组dates而不是array,以避免混淆。)

基本上有两种选择:

  1. 遍历您的dates数组,并为每个条目循环浏览objArray寻找匹配项,并在找到时添加到您的priceResult数组,或

  2. 根据objArray, then loop through your日期array once, building the priceResult`数组制作地图。

  3. 循环和循环

    您可以使用dates循环浏览forEach数组,然后使用Array#some查看objArray是否包含日期并添加到priceResult如果是这样(这是一个ES5功能,但你可以为真正的老浏览器填充它):

    var priceResult = [];
    dates.forEach(function(date) {
        objArray.some(function(object) {
            if (object.date == date) {
                priceResult.push(object.price);
                return true;
            }
        });
    });
    

    Array#some会一直循环,直到您返回true,这就是我们在找到第一个匹配项时这样做的原因。这就是为什么我说这是“循环和循环”,即使我们只写一个循环,另一个在Array#some内。

    var dates = ['2014-10-09', '2014-10-10', '2014-10-11', '2014-10-12'];
    
    var objArray = [
      {
        date: "2014-10-09",
        model: "A",
        price: "100"
      },
      {
        date: "2014-10-10",
        model: "A",
        price: "99"
      },
      {
        date: "2014-10-12",
        model: "A",
        price: "102"
      }
    ];
    
    // Do it
    var priceResult = [];
    dates.forEach(function(date) {
      objArray.some(function(object) {
        if (object.date == date) {
          priceResult.push(object.price);
          return true;
        }
      });
    });
    snippet.log(priceResult.join(", "));
    <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
    <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

    映射和循环

    首先,按日期创建价格地图:

    var prices = {};
    objArray.forEach(function(object) {
        prices[object.date] = object.price;
    });
    

    ...然后创建结果:

    var priceResult = [];
    dates.forEach(function(date) {
        if (prices.hasOwnProperty(date)) {
            priceResult.push(prices[date]);
        }
    });
    

    var dates = ['2014-10-09', '2014-10-10', '2014-10-11', '2014-10-12'];
    
    var objArray = [
      {
        date: "2014-10-09",
        model: "A",
        price: "100"
      },
      {
        date: "2014-10-10",
        model: "A",
        price: "99"
      },
      {
        date: "2014-10-12",
        model: "A",
        price: "102"
      }
    ];
    
    // Create the map
    var prices = {};
    objArray.forEach(function(object) {
      prices[object.date] = object.price;
    });
    
    // Create your results:
    var priceResult = [];
    dates.forEach(function(date) {
      if (prices.hasOwnProperty(date)) {
        priceResult.push(prices[date]);
      }
    });
    
    // Show them
    snippet.log(priceResult.join(", "));
    <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
    <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 2 :(得分:0)

lodash是最好的图书馆。但是你没有使用其他库&#34;就说了#34;所以你需要在本地进行。

最简单的方法是嵌套for循环:

var i, j, d, res = [];
for (i=0; i<dateArray.length; i++) {
  d = dateArray[i];
  for (j=0; j<objArray.length; j++) {
    if (objArray[j] && objArray[j].date && objArray[j].date === d) {
       res.push(objArray[j].price);
       j = objArray.length; // don't waste energy searching any more, since we found it
    }
  }
}
// res now contains all you wanted

如果objArray非常大,并且您不想多次搜索它,那么您可以将其转换为按日期索引的对象:

var i, obj = {}, d, res = [];
for (i=0; i<objArray.length; i++) {
  if (objArray[i] && objArray[i].date) {
    obj[objArray[i].date] = objArray[i];
  }
}
for (i=0; i<dateArray.length; i++) {
  d = dateArray[i];
  res.push(obj[d] ? obj[d].price : null : null);
}
// res now contains all you wanted

答案 3 :(得分:0)

试试这个:

var temp[] 

temp= jQuery.grep(objArray , function (n, i)

 { 
    for(j=0;j<dateArray.lenght+j++ )
        if( n.date === dateArray[j])
            return n.price;
 );

答案 4 :(得分:0)

遍历对象并在数组中搜索日期

// Add contains to array proto: http://css-tricks.com/snippets/javascript/javascript-array-contains/
var priceResult = [];
for(var i in objArray) {
    if(dateArray.contains(objArray[i].date)) priceResult.push(objArray[i].date));
}
console.log('matches:', priceResult);

答案 5 :(得分:0)

此函数将为您提供对象数组中所有单个数组的映射

function getArrayMap(array) {
    var map={}
    for(var i=0;i<array.length;i++){
        var o = array[i];
        for(var k in o){
            if(!map[k]){
                map[k]=[];
            }
            map[k].push(o[k]);
        }
    }
    return map;
}

你可以像 -

一样使用它
var map = getArrayMap(objArray);

console.log(map["date"]);//date array
console.log(map["price"]);//price array
console.log(map["model"]);//model array

答案 6 :(得分:0)

如果我正确理解你的问题,对于数组中的所有值,你想检查objArr并找到每个日期的价格,如果没有找到你想要插入null。如果这是你想要的,那么下面的帮助

       var found= false; 
       var list=[];  
    for(var i=0; i< dateArray.length; i++)
    {
        for(var j=0; j< objArray.length; j++)
        {
            if(objArray[j].date ==  dateArray[i])
            {
            list.push(objArray[j].price);
            found =  true;
            }
        }
        if(!found)
        {
        list.push("null");
        }
        found = false;
    }

alert(list);

答案 7 :(得分:0)

var dates = ['2014-10-09','2014-10-10','2014-10-11','2014-10-12'];
var objArray = [{date:"2014-10-09", model:"A", price:"100" }, {date:"2014-10-10", model:"A", price:"99" }, {date:"2014-10-12", model:"A", price:"102" }];

var val;
var priceResult = [];
for (var a in dates) {
    val = null;
    for (var b in objArray) {
        if (dates[a] == objArray[b].date) {
            val = objArray[b].price;
        }
    }
    priceResult.push(val);
}

    var dates = ['2014-10-09', '2014-10-10', '2014-10-11', '2014-10-12'];
    var objArray = [{
      date: "2014-10-09",
      model: "A",
      price: "100"
    }, {
      date: "2014-10-10",
      model: "A",
      price: "99"
    }, {
      date: "2014-10-12",
      model: "A",
      price: "102"
    }];

    var val;
    var priceResult = [];
    for (var a in dates) {
      val = null;
      for (var b in objArray) {
        if (dates[a] == objArray[b].date) {
          val = objArray[b].price;
        }
      }
      priceResult.push(val);
    }

     // output result in StackOverflow snippet
    document.write(JSON.stringify(priceResult));

答案 8 :(得分:0)

dateArray = ["2014-10-09", "2014-10-10", "2014-10-11", "2014-10-12"];
function ObjectExample(date1,model,price)
{
    this.date1 = date1;
    this.model = model;
    this.price = price;
}
var objArray = [new ObjectExample("2014-10-09","A","100"), new ObjectExample("2014-10-10","A","99"), new ObjectExample("2014-10-12","A","102")];
var i = 0;
var priceDate = new Array();
var count = 0;
while(i < dateArray.length)
{
    var j = 0;
    while(j < objArray.length)
    {
        if(dateArray[i] == objArray[j].date1)
        {
             priceDate[count] = objArray[j].price;
             break;
        }
        else priceDate[count] = "NULL";
        j = j + 1;
    }
    i = i + 1;
    count++;
}
document.write(priceDate);