简体   繁体   English

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

[英]Comparing an Array with an Objects' Array in JavaScript

I am new to JavaScript and wondering how can I compare an array with another array consists of JavaScript objects. 我是JavaScript的新手,想知道如何将一个数组与另一个包含JavaScript对象的数组进行比较。

  1. The array is a series of sorted time in the "YYYY-MM-DD" format. 数组是“ YYYY-MM-DD”格式的一系列排序时间。
  2. The array of objects missed some price values of several days. 对象数组错过了几天的某些价格值。
  3. I want to find the missed value and assign it as "NULL". 我想找到丢失的值并将其分配为“ NULL”。

For example, I have an array as: 例如,我有一个数组为:

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

and an array with objects as: 和一个数组,对象为:

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

I want to get the price array in this way: 我想以这种方式获取价格数组:

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

What would be the most efficient way without using other libraries? 不使用其他库的最有效方法是什么? I wanted to see if anyone had a more elegant solution. 我想看看是否有人有一个更优雅的解决方案。 I deeply appreciate your help. 非常感谢您的帮助。

You can create a lookup set from the object array, then you can use that to translate the dates to prices. 您可以从对象数组创建查找集,然后可以使用该查找集将日期转换为价格。

This scales well, as it is an O(n+m) solution rather than the O(n*m) solution that you get if you use a loop in a loop to find the prices. 这样可以很好地扩展,因为它是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)); 

Note: Instead of the string 'NULL' you might want to use the value null instead, as it is generally easier to handle. 注意:您可能希望使用值null代替字符串'NULL' ,因为它通常更易于处理。

(I'm going to call your first array dates rather than array , to avoid confusion.) (为了避免混淆,我将称呼您的第一个数组dates而不是array 。)

There are basically two options: 基本上有两种选择:

  1. Loop through your dates array and, for each entry, loop through the objArray looking for a match, and when found add to your priceResult array, or 遍历dates数组,对于每个条目,遍历objArray寻找匹配项,找到后添加到priceResult数组中,或者

  2. Build a map from your objArray, then loop through your dates array once, building the priceResult` array. objArray, then loop through your构建一个地图objArray, then loop through your dates array once, building the priceResult`数组。

Looping and Looping 循环播放

You can loop through your dates array using forEach , and you can use Array#some to find out whether your objArray contains the date and add to priceResult if so (it's an ES5 feature, but you can polyfill it for really old browsers): 您可以使用forEach遍历dates数组,并且可以使用Array#some来查找objArray是否包含日期,如果是,则将其添加到priceResult (这是ES5功能,但您可以对真正的旧浏览器进行priceResult ):

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

Array#some keeps looping until you return true , which is why we do that when we find the firs tmatch. Array#some一直循环播放,直到您返回true为止,这就是为什么当我们找到第一个tmatch时才这样做。 That's why I say this is "looping and looping," even though we only write one loop, the other is within Array#some . 这就是为什么我说这是“循环和循环”的原因,即使我们只编写一个循环,另一个也位于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> 

Mapping and Looping 映射和循环

First, create a map of prices by date: 首先,按日期创建价格图:

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

...then create your results: ...然后创建您的结果:

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> 

lodash is the best library for this. lodash是最好的库。 But you did say "without using other libraries", so you will need to do it natively. 但是您确实说过“不使用其他库”,因此您将需要本地执行。

The easiest way to do it is nested for loops: 最简单的方法是嵌套在循环中:

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

If objArray is really big, and you don't want to search it multiple times, then you could turn it into an object indexed by date: 如果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

Try this: 尝试这个:

var temp[] 

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

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

Loop trough the object and search for the date in your array 循环遍历对象并在数组中搜索日期

// 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);

This function will give you map of all individual arrays in your object array 该函数将为您提供对象数组中所有单个数组的映射

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

you can use it like - 你可以像这样使用它-

var map = getArrayMap(objArray);

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

If i am understanding your question correctly, for all the values in array, you want to check the objArr and find the price for each date, and if not found u want to inset null. 如果我正确地理解了您的问题,对于数组中的所有值,您要检查objArr并找到每个日期的价格,如果找不到,则要插入null。 If this is what you want, then following will help 如果这是您想要的,那么遵循将有所帮助

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

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

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

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