使用不同的对象数组数据更新对象数组
Update an array of objects with a different array of objects data
我有一个非常棘手的操作要做。原来如此。
我有一个名为 'data1'
的对象数组
[Object, Object, Object]
0:Object
id="00456145" //check this
name: "Rick"
upper:"0.67"
lower:"-0.34"
1:Object
id="00379321"
name:"Anjie"
upper:"0.46"
lower:"-0.56"
2:Object
id="00323113"
name:"dillan"
upper:"0.23"
lower:"-0.11"
我只对这些对象数组中的 id、上限值和下限值感兴趣。
这是名为 'data2'
的第二个对象数组
[Object, Object]
0:Object
id="0045614" //present here if we remove last element of '00456145'
cast="Rick"
Contact: "Yes"
upper:"0.11" //need to be updated to '0.67'
lower:"-0.11" //need to be updated to '-0.34'
1:Object
id="0032311" //present here if we remove last element of '00323113'
cast:"dillan"
Contact:"Maybe"
upper:"0.11"
lower:"-0.11"
所以,这就是我必须要做的。我会先检查'data1'。检查 'data1' 中存在的 ID。例如对象 0 有 id="00456145"
我删除了其中的最后一个数字。所以它变成 id="0045614"。
然后我比较这个 id 是否存在于对象 'data2' 中。
如果存在,则 'data1' 中对象 0 的上限值和下限值将传递给存在 id 的对象 'data2'。在这种情况下,'data2' 的对象 0 具有 id='0045614'。
因此上限值和下限值将分别更新为 0.67 和 -0.34。
其他数组也一样。所以最终的输出应该是这样的 'data2'
[Object, Object]
0:Object
id="0045614"
cast="Rick"
Contact: "Yes"
upper:"0.67" //updated
lower:"-0.34" //updated
1:Object
id="0032311"
cast:"dillan"
Contact:"Maybe"
upper:"0.23" //updated
lower:"-0.11" //updated
您可以尝试类似的方法:
for (var i = 0; i < data1.length; i++) {
var item = data1[i];
var trim = item.id.substr(0, item.id.length - 1);
for (var j = 0; j < data2.length; j++) {
var item2 = data2[j];
if (item2.id === trim) {
item2.upper = item.upper;
item2.lower = item.lower;
}
}
}
如果您使用的是 es6,您可以通过以下方式简化代码:
for (let item of data1) {
let trim = item.id.substr(0, item.id.length - 1);
for (let item2 of data2) {
if (item2.id === trim) {
item2.upper = item.upper;
item2.lower = item.lower;
}
}
}
这是一个使用 Array.prototype.forEach
的解决方案。遍历 data2
个对象,如果 id 与 data1
中的任何对象匹配,则用匹配的对象更新值。
var data1 = [{
id: "00456145",
name: "Rick",
upper: "0.67",
lower: "-0.34"
}, {
id: "00379321",
name: "Anjie",
upper: "0.46",
lower: "-0.56"
}, {
id: "00323113",
name: "dillan",
upper: "0.23",
lower: "-0.11"
}];
var data2 = [{
id: "0045610", //present here if we remove last element of '00456145'
cast: "Rick",
Contact: "Yes",
upper: "0.11", //need to be updated to '0.67'
lower: "-0.11" //need to be updated to '-0.34'
}, {
id: "0032311", //present here if we remove last element of '00323113'
cast: "dillan",
Contact: "Maybe",
upper: "0.11",
lower: "-0.11"
}];
data2.forEach(function(item2){
data1.forEach(function(item1){
if (item1.id.substring(0,7) === item2.id){ // can be `item1.id.indexOf(item2.id) == 0
item2.upper = item1.upper;
item2.lower = item1.lower;
}
});
});
console.log(data2);
您可以使用
data1.forEach(function(obj) {
var search = obj.id.slice(0, -1);
data2.forEach(function(d) {
if (d.id === search) {
d.upper = obj.upper;
d.lower = obj.lower;
};
});
});
做这个。
也许这就是你想要的。
var data1 = [{
id: "00456145",
name: "Rick",
upper: "0.67",
lower: "-0.34"
}, {
id: "00379321",
name: "Anjie",
upper: "0.46",
lower: "-0.56"
}, {
id: "00323113",
name: "dillan",
upper: "0.23",
lower: "-0.11"
}];
var data2 = [{
id:"0045614",
cast:"Rick",
Contact: "Yes",
upper:"0.11",
lower:"-0.11",
}, {
id:"0032311",
cast:"dillan",
Contact:"Maybe",
upper:"0.11",
lower:"-0.11",
}];
data2.forEach(function(data2Value) {
data1.forEach(function(data1Value) {
if(data1Value.id.substr(0, data1Value.id.length - 1) === data2Value.id) {
data2Value.upper = data1Value.upper;
data2Value.lower = data1Value.lower;
}
});
});
console.log(data2);
我喜欢这种情况下的 array#some,这样您就可以跳出循环,从而避免不必要的迭代:
var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34" }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56" }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }];
var data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11" }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }];
data2 = data2.map(function(item) {
data1.some(function(a) {
if (item.id == a.id.slice(0, -1)) {
item.upper = a.upper;
item.lower = a.lower;
return true;
}
});
return item;
});
console.log(data2);
我建议使用对象作为散列 table 或地图。那么只需要两个循环,一个用于获取引用,一个用于分配。
大O:O(n+m)
虽然我其实不知道哪个更适合(Map vs Object),你可以得到你自己的照片:
- Map vs Object in JavaScript
提案 Object
var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }],
data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }],
hash = Object.create(null);
data1.forEach(function (a) {
hash[a.id.slice(0, -1)] = a;
});
data2.forEach(function (a) {
var o = hash[a.id];
o && Object.keys(o).forEach(function (k) {
if (k !== 'id' && a[k] !== o[k]) {
a[k] = o[k];
}
});
});
console.log(data2);
提案 Map
var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }],
data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }],
map = new Map;
data1.forEach(function (a) {
map.set(a.id.slice(0, -1), a);
});
data2.forEach(function (a) {
var o = map.get(a.id);
o && Object.keys(o).forEach(function (k) {
if (k !== 'id' && a[k] !== o[k]) {
a[k] = o[k];
}
});
});
console.log(data2);
我有一个非常棘手的操作要做。原来如此。
我有一个名为 'data1'
的对象数组[Object, Object, Object]
0:Object
id="00456145" //check this
name: "Rick"
upper:"0.67"
lower:"-0.34"
1:Object
id="00379321"
name:"Anjie"
upper:"0.46"
lower:"-0.56"
2:Object
id="00323113"
name:"dillan"
upper:"0.23"
lower:"-0.11"
我只对这些对象数组中的 id、上限值和下限值感兴趣。
这是名为 'data2'
的第二个对象数组[Object, Object]
0:Object
id="0045614" //present here if we remove last element of '00456145'
cast="Rick"
Contact: "Yes"
upper:"0.11" //need to be updated to '0.67'
lower:"-0.11" //need to be updated to '-0.34'
1:Object
id="0032311" //present here if we remove last element of '00323113'
cast:"dillan"
Contact:"Maybe"
upper:"0.11"
lower:"-0.11"
所以,这就是我必须要做的。我会先检查'data1'。检查 'data1' 中存在的 ID。例如对象 0 有 id="00456145"
我删除了其中的最后一个数字。所以它变成 id="0045614"。 然后我比较这个 id 是否存在于对象 'data2' 中。
如果存在,则 'data1' 中对象 0 的上限值和下限值将传递给存在 id 的对象 'data2'。在这种情况下,'data2' 的对象 0 具有 id='0045614'。
因此上限值和下限值将分别更新为 0.67 和 -0.34。
其他数组也一样。所以最终的输出应该是这样的 'data2'
[Object, Object]
0:Object
id="0045614"
cast="Rick"
Contact: "Yes"
upper:"0.67" //updated
lower:"-0.34" //updated
1:Object
id="0032311"
cast:"dillan"
Contact:"Maybe"
upper:"0.23" //updated
lower:"-0.11" //updated
您可以尝试类似的方法:
for (var i = 0; i < data1.length; i++) {
var item = data1[i];
var trim = item.id.substr(0, item.id.length - 1);
for (var j = 0; j < data2.length; j++) {
var item2 = data2[j];
if (item2.id === trim) {
item2.upper = item.upper;
item2.lower = item.lower;
}
}
}
如果您使用的是 es6,您可以通过以下方式简化代码:
for (let item of data1) {
let trim = item.id.substr(0, item.id.length - 1);
for (let item2 of data2) {
if (item2.id === trim) {
item2.upper = item.upper;
item2.lower = item.lower;
}
}
}
这是一个使用 Array.prototype.forEach
的解决方案。遍历 data2
个对象,如果 id 与 data1
中的任何对象匹配,则用匹配的对象更新值。
var data1 = [{
id: "00456145",
name: "Rick",
upper: "0.67",
lower: "-0.34"
}, {
id: "00379321",
name: "Anjie",
upper: "0.46",
lower: "-0.56"
}, {
id: "00323113",
name: "dillan",
upper: "0.23",
lower: "-0.11"
}];
var data2 = [{
id: "0045610", //present here if we remove last element of '00456145'
cast: "Rick",
Contact: "Yes",
upper: "0.11", //need to be updated to '0.67'
lower: "-0.11" //need to be updated to '-0.34'
}, {
id: "0032311", //present here if we remove last element of '00323113'
cast: "dillan",
Contact: "Maybe",
upper: "0.11",
lower: "-0.11"
}];
data2.forEach(function(item2){
data1.forEach(function(item1){
if (item1.id.substring(0,7) === item2.id){ // can be `item1.id.indexOf(item2.id) == 0
item2.upper = item1.upper;
item2.lower = item1.lower;
}
});
});
console.log(data2);
您可以使用
data1.forEach(function(obj) {
var search = obj.id.slice(0, -1);
data2.forEach(function(d) {
if (d.id === search) {
d.upper = obj.upper;
d.lower = obj.lower;
};
});
});
做这个。
也许这就是你想要的。
var data1 = [{
id: "00456145",
name: "Rick",
upper: "0.67",
lower: "-0.34"
}, {
id: "00379321",
name: "Anjie",
upper: "0.46",
lower: "-0.56"
}, {
id: "00323113",
name: "dillan",
upper: "0.23",
lower: "-0.11"
}];
var data2 = [{
id:"0045614",
cast:"Rick",
Contact: "Yes",
upper:"0.11",
lower:"-0.11",
}, {
id:"0032311",
cast:"dillan",
Contact:"Maybe",
upper:"0.11",
lower:"-0.11",
}];
data2.forEach(function(data2Value) {
data1.forEach(function(data1Value) {
if(data1Value.id.substr(0, data1Value.id.length - 1) === data2Value.id) {
data2Value.upper = data1Value.upper;
data2Value.lower = data1Value.lower;
}
});
});
console.log(data2);
我喜欢这种情况下的 array#some,这样您就可以跳出循环,从而避免不必要的迭代:
var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34" }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56" }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }];
var data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11" }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }];
data2 = data2.map(function(item) {
data1.some(function(a) {
if (item.id == a.id.slice(0, -1)) {
item.upper = a.upper;
item.lower = a.lower;
return true;
}
});
return item;
});
console.log(data2);
我建议使用对象作为散列 table 或地图。那么只需要两个循环,一个用于获取引用,一个用于分配。
大O:O(n+m)
虽然我其实不知道哪个更适合(Map vs Object),你可以得到你自己的照片:
- Map vs Object in JavaScript
提案 Object
var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }],
data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }],
hash = Object.create(null);
data1.forEach(function (a) {
hash[a.id.slice(0, -1)] = a;
});
data2.forEach(function (a) {
var o = hash[a.id];
o && Object.keys(o).forEach(function (k) {
if (k !== 'id' && a[k] !== o[k]) {
a[k] = o[k];
}
});
});
console.log(data2);
提案 Map
var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }],
data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }],
map = new Map;
data1.forEach(function (a) {
map.set(a.id.slice(0, -1), a);
});
data2.forEach(function (a) {
var o = map.get(a.id);
o && Object.keys(o).forEach(function (k) {
if (k !== 'id' && a[k] !== o[k]) {
a[k] = o[k];
}
});
});
console.log(data2);