NodeJS 读取javascript对象以匹配如果一个项目存在从一个对象数组

d7v8vwbk  于 2023-03-12  发布在  Node.js
关注(0)|答案(4)|浏览(119)

我有一个名为obj的对象的javascript数组和另一个名为finalObj的对象

const obj = [{ 'name': 'skip', low: 20, high: 10 },
{ 'name': 'jump', low: 5, high: 20},
{ 'name': 'tall', low: 3, high: 2},
{ 'name': 'wind', low: 5, high: 10},
{ 'name': 'hire', low: 7, high: 6 }]

const finalObj = {
'Shopping mall': {
   'names': ['skip', 'jump'],
   'low': 0,
   'high': 0
},
'Parking garage': {
  'names': ['hire'],
  'low': 0,
  'high': 0
},
'Falling Tower': {
  'names': ['tall', 'wind'],
  'low': 0, 
  'high': 0
}
}

现在,如果具有项目名称的对象的obj数组与名称的finalObj匹配,则将低值和高值添加到finalObj中。
最后的输出应该是这样的:

const finalObj = {
'Shopping mall': {
   'names': ['skip', 'jump'],
   'low': 25,
   'high': 30
},
'Parking garage': {
  'names': ['hire'],
  'low': 7,
  'high': 6
},
'Falling Tower': {
  'names': ['tall', 'wind'],
  'low': 8, 
  'high': 12
}
}

我试着迭代对象,但到目前为止没有运气。

for (const o in obj) {
 for (const f in Object.entries(finalObj)) {
   if (f[1]['names'].indexOf(obj[o].name >= 0)) {
     console.log("matched name : " + obj[o].name)
   }
 }
}
s4n0splo

s4n0splo1#

使用obj.forEach()循环数组,然后使用Object.values(finalObj).forEach()循环finalObj中的值。
然后使用includes()测试obj中的name是否在names中,并将其添加到lowhigh属性中。

const obj = [
  { 'name': 'skip', low: 20, high: 10 },
  { 'name': 'jump', low: 5, high: 20},
  { 'name': 'tall', low: 3, high: 2},
  { 'name': 'wind', low: 5, high: 10},
  { 'name': 'hire', low: 7, high: 6 }
]

const finalObj = {
  'Shopping mall': {
     'names': ['skip', 'jump'],
     'low': 0,
     'high': 0
  },
  'Parking garage': {
    'names': ['hire'],
    'low': 0,
    'high': 0
  },
  'Falling Tower': {
    'names': ['tall', 'wind'],
    'low': 0, 
    'high': 0
  }
}

obj.forEach(o =>
  Object.values(finalObj).forEach(f => {
    if (f.names.includes(o.name)) {
      f.low += o.low;
      f.high += o.high;
    }
  }));

console.log(finalObj);
djp7away

djp7away2#

for (const o of obj) {
  for (const f in finalObj) {
    if (finalObj[f]['names'].indexOf(o.name) >= 0) {
      finalObj[f]['low'] += o.low;
      finalObj[f]['high'] += o.high;
    }
  }
}

Object.entries(finalObj)返回一个键值对数组,所以当你使用for...in循环时,f将是一个数组而不是一个对象。你应该使用for...of来直接循环值。
indexOf检查不太正确,需要检查索引是否大于或等于0(不是属性名本身的值)。

py49o6xq

py49o6xq3#

嘿你可以用这个

for (const key in finalObj) {
  const names = finalObj[key].names;
  let low = 0;
  let high = 0;
  for (const name of names) {
    const match = obj.find(obj => obj.name === name);
    if (match) {
      low += match.low;
      high += match.high;
    }
  }
  finalObj[key].low = low;
  finalObj[key].high = high;
}

名称取自数组,我循环遍历它们以找到它们的值,并将它们添加到末尾的值中,我更新finalObj

qco9c6ql

qco9c6ql4#

可以使用for ... of迭代数组。

// In this first loop, you want to iterate the
// values of the Object `finalObj`. For that,
// you can use `Object.values(...)`.
for (let fo of Object.values(finalObj)) {
    // Next, a normal `for ... of` works since `obj` is an array.
    for (let o of obj) {
        // Finally, search an array for a value
        // with `Array.includes` like so.
        if (fo.names.includes(o.name)) {
            fo.low += o.low
            fo.high += o.high
        }
    }
}

相关问题