如何解决如何在普通JS上数组? 完整代码
我不确定是否应该将其称为归一化,但是我没有想到更好的名称,因此任务是:
我有一个对象数组(我们叫它 mainData ,其中包含obj1
和obj2
),一个道具是对象数组someData
。 someData
中的对象及其数量各不相同。我想使用 mainData ,但是每个包含的对象在someData
内部应具有相同的对象,如下所示:
我有:
let obj1 = {
someData: [
{
name: 'Name 1',value: 1111,},{
name: 'Name 2',value: 2222,{
name: 'Name 3',value: 3333,}
]
}
let obj2 = {
someData: [
{
name: 'Name 1',{
name: 'Name 4',value: 4444,{
name: 'Name 5',value: 5555,}
]
}
我想要:
let obj1 = {
someData: [
{
name: 'Name 1',value: null,}
]
}
let obj2 = {
someData: [
{
name: 'Name 1',}
]
}
解决方法
尝试一下。遍历每个数组,然后检查对象是否在另一个数组中。如果不是,则将其推送为null。请在下面找到一个示例。
let obj1 = {
someData: [
{
name: "Name 1",value: 1111
},{
name: "Name 2",value: 2222
},{
name: "Name 3",value: 3333
}
]
};
let obj2 = {
someData: [
{
name: "Name 1",{
name: "Name 4",value: 4444
},{
name: "Name 5",value: 5555
}
]
};
obj1.someData.forEach(obj => {
const itemInSecondArray = obj2.someData.find(
item => item.name === obj.name
);
if (!itemInSecondArray) {
obj2.someData.push({
name: obj.name,value: null
});
}
});
obj2.someData.forEach(obj => {
const itemInFirstArray = obj1.someData.find(
item => item.name === obj.name
);
if (!itemInFirstArray) {
obj1.someData.push({
name: obj.name,value: null
});
}
});
// Sort
obj1.someData.sort((a,b) => (a.name < b.name)? -1: 1);
obj2.someData.sort((a,b) => (a.name < b.name)? -1: 1);
console.log(obj1);
console.log(obj2);
,
您可以存储唯一名称的数组。并遍历每个数据,如果名称相同,则保持不变,否则添加一个值为null的新数据
const getNames = arr => arr.map(el => el.name)
const buildNewDataFromUniqueNames = (arr,uniqueNames) =>
uniqueNames.map(name => {
const el = arr.find(el => el.name === name)
return el || { name,value: null }
})
const uniqueNames = Array.from(
new Set([...getNames(data1),...getNames(data2)])
)
console.log({ someData: buildNewDataFromUniqueNames(data1,uniqueNames) })
console.log({ someData: buildNewDataFromUniqueNames(data2,uniqueNames) })
完整代码
let { someData: data1 } = {
someData: [
{
name: 'Name 1',{
name: 'Name 2',{
name: 'Name 3',value: 3333
}
]
}
let { someData: data2 } = {
someData: [
{
name: 'Name 1',{
name: 'Name 4',{
name: 'Name 5',value: 5555
}
]
}
const getNames = arr => arr.map(el => el.name)
const buildNewDataFromUniqueNames = (arr,uniqueNames) })
,
这是一个通用函数,它不依赖于硬编码的属性名称(例如“ name”或“ value”),但是将“ key”属性的名称作为参数,并将任何其他属性设置为{{ 1}}。
该函数使用null
来确保在另一个数组中有效查找项目,避免了 O(n²)的时间复杂度(使用Map
和相似的方法)。
结果数组也将根据key属性的大小进行排序:
find
,
您可以获取所有严重的名称,并将该数组与其他数组的数据映射,或者使用具有real_start_at
值的新对象。
null
const
map = (source,i = 0) => name => source[i]?.name === name
? source[i++]
: { name,value: null },array1 = [{ name: 'Name 1',value: 1111 },{ name: 'Name 2',value: 2222 },{ name: 'Name 3',value: 3333 }],array2 = [{ name: 'Name 1',{ name: 'Name 4',value: 4444 },{ name: 'Name 5',value: 5555 }],names = [...new Set([...array1,...array2].map(({ name }) => name))].sort(),result1 = names.map(map(array1)),result2 = names.map(map(array2));
console.log(result1);
console.log(result2);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。