[英]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对象的数组进行比较。
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: 基本上有两种选择:
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
数组中,或者
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`数组。
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>
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.