JavaScript 数组推送不断重复它自己找不到原因



我不知道为什么这个数组Und会得到重复的键值。 我已经在这个上面呆了三个星期。我一定在做什么愚蠢的事情。我知道它们是循环。但是除了推动之外,一切都有效。它记录密钥何时重复等等。但它以某种方式将其添加到其中?非常令人困惑。 这是我的Javascript


var array = [
{"size":["12","22"]},
{"color":["blue"]},
{"design":["flower-blue"]},
{"size":["12","22","44"]},
{"color":["red"]},
{"design":["flower-blue"]}
]
//output array
arrayUnd=[           
{"color":["red"]}
]
//is array?
console.log(  Array.isArray(array))
function pusher(obj){
arrayUnd.push(obj)
}
function isRepeat(key,value,obj){
// console.log(key[0])

for (let item=0; item < arrayUnd.length; item++ ){

if ( arrayUnd[item].hasOwnProperty(key)){
console.log("key: " + key)
console.log("yes")
console.log(arrayUnd)
}
else{
console.log("keyno: " + key)
console.log("no")
//pusher(obj)
if ( arrayUnd[item].hasOwnProperty(key) === false){
pusher(obj)
}
console.log(arrayUnd)
}
}

}
array.forEach((obj)=>{
var a= Object.keys(obj)
var b= Object.values(obj)
isRepeat(a,b,obj)
})
console.log(arrayUnd)

您的循环正在检查所有对象以查看它们是否不匹配。 其中至少有一个不匹配,所以它会尝试推动很多次。 你需要检查所有元素,并在检查它们是否存在之后决定是否要推送.
Current 逻辑等效于:如果 arrUnd 中的任何内容不匹配,每次我检查时都推我.
some在这里工作,因为它检查是否有任何匹配,并返回 true 或 false,然后您可以使用它来决定是否要推送(只有一次, 在我发现数组中是否有任何内容匹配后,决定使用最终结果(。

使用一些来检查是否存在具有相同键的任何其他元素。 如果找不到,则推送。

var array = [{
"size": ["12", "22"]
},
{
"color": ["blue"]
},
{
"design": ["flower-blue"]
},
{
"size": ["12", "22", "44"]
},
{
"color": ["red"]
},
{
"design": ["flower-blue"]
}
]
//output array
arrayUnd = [{
"color": ["red"]
}]
//is array?
console.log(Array.isArray(array))
function pusher(obj) {
arrayUnd.push(obj)
}
function isRepeat(key, value, obj) {
if(!arrayUnd.some(x => x.hasOwnProperty(key[0])))
arrayUnd.push(obj)
}
array.forEach((obj) => {
var a = Object.keys(obj)
var b = Object.values(obj)
isRepeat(a, b, obj)
})
console.log(arrayUnd)

您正在将数组传递给isRepeat而不是对象的键和值。

Object.keys()返回一个数组,即使该对象只有一个键。

当你检查if ( arrayUnd[item].hasOwnProperty(key) === false)时,arrayUnd[item].hasOwnProperty(key)总是假的,所以对象总是被推送到你的数组。

您可以通过访问每个对象的第一个键和值来解决此问题:

array.forEach((obj)=>{
var a= Object.keys(obj)
var b= Object.values(obj)
isRepeat(a[0],b[0],obj)
})

您的代码不断将对象推送到 arrayUnd 的原因是,当它遍历数组时,它会检查数组键是否存在,如果不存在,它会将其推送到 arrayUnd,现在您首先有 2 个问题,您实际上并没有检查数组键以匹配您比较对象,因此您将始终得到 false, 其次,每次推送到数组时,数组的长度都会增加,因此迭代次数也会增加。

您可以通过两行代码实现此目的

var array = [
{"size":["12","22"]},
{"color":["blue"]},
{"design":["flower-blue"]},
{"size":["12","22","44"]},
{"color":["red"]},
{"design":["flower-blue"]}
]
//output array
arrayUnd=[           
{"color":["red"]}
]
array.forEach(p=>Object.entries(p).forEach(p=>{
!arrayUnd.some(o=>o.hasOwnProperty(p[0])) ? arrayUnd.push({[p[0]]:p[1]}):null
}))
console.log(arrayUnd)

var inpAry = [
{ "size": ["12", "22"] },
{ "color": ["blue"] },
{ "design": ["flower-blue"] },
{ "size": ["12", "22", "44"] },
{ "color": ["red"] },
{ "design": ["flower-blue"] }
];
var opAry = [
{ "color": ["red"] }
];
inpAry.forEach(inpAryElem => {
var ipAryElemKeys = Object.keys(inpAryElem);
var ipAryElemVals = Object.values(inpAryElem);
ipAryElemKeys.forEach((ipAryElmKey,ipAryElemKyIdx) => {
var isKeyPresent = false;
opAry.forEach(opAryElem => {
if(opAryElem[ipAryElmKey]) {
isKeyPresent = true;
opAryElem[ipAryElmKey].push(...ipAryElemVals[ipAryElemKyIdx]);
}
});
if(!isKeyPresent) {
opAry.push({[ipAryElmKey]:ipAryElemVals[ipAryElemKyIdx]});
}
})
});
console.log(opAry);

相关内容

最新更新