Javascript 检查 object 是否在另一个 object 中并将长度与其他 object 的键匹配

Javascript check if object is in another object and match length to other objects keys

我为标题道歉。由于我还在学习 Javascript.

,所以我不太确定如何最好地表达这一点

我有 object 个出现动态值的日期,如下所示: (键 = 日期,值 = 数字)

2021-12-23: 4
2021-12-24: 7
2021-12-27: 6
2022-01-05: 5
... etc

我还有另一个 object 看起来像这样:

2022-01-05: 5

基本上,我需要第二个 object 来为所有 non-matching 键填充 0。例如,第二个 object 需要如下所示(匹配值无关紧要):

2021-12-23: 0
2021-12-24: 0
202-12-27: 0
2022-01-05: 5

我真的被这个问题难住了,任何 javascript 帮助将不胜感激。

好的所以你想要做的是循环遍历第一个对象(具有多个 DateString keys/Number 值的对象)的所有键并将新数值设置为 0如果该键不包含在第二个对象中。

根据您的描述:

const firstObject = {
2021-12-23: 4,
2021-12-24: 7,
2021-12-27: 6,
2022-01-05: 5
}
const secondObject = {
2022-01-05: 5
}

似乎这里的代码会受益于 Object.entries,这是一个你可以 运行 对象 Object.entries(myObject || {}) 的函数,它会 return 一个二维的对象的数组 [[key, val], [key, val]].

因此您的最终代码将如下所示:

const mapTo0s = (firstObject, secondObject) => {
  return Object.fromEntries(Object.entries(firstObject).map(([dateString, value]) => {
if (!secondObject[dateString]) {
  return [dateString, 0];
}
return [dateString, value]; // assumes you want to keep the value as is when the secondObject has the value.
}))
};

Object.fromEntries 是另一种 javascript 方法,它将数组的二维数组转换为具有相应键的对象。因此,如果您发送 [['05-10-2021', 3]],它将 return {'05-10-2021': 3 }.

你可以运行这样的功能:


const result = mapTo0s(firstObject, secondObject)
// should result in:
console.log({ result })
/* { result: {
2021-12-23: 0,
2021-12-24: 0,
202-12-27: 0,
2022-01-05: 5
}
}
*/

这是一个使用 Object.entriesArray.prototype.reduce 的实现,但实际上有很多方法可以解决这个问题。

const original = {
  "2021-12-23": 4,
  "2021-12-24": 7,
  "2021-12-27": 6,
  "2022-01-05": 5
}
function filterObjectByKey( o, key ){
  return Object.entries(o).reduce((acc, [k,v])=>{
    acc[k] = ( k === key ) ? v : 0;
    return acc;
  }, {});
}
const filtered = filterObjectByKey( original, "2022-01-05");

console.log( filtered );

更新: 该函数还可以接受辅助对象作为参数并根据其键进行过滤:

const original = {
  "2021-12-23": 4,
  "2021-12-24": 7,
  "2021-12-27": 6,
  "2022-01-05": 5
}
const secondary = {
  "2022-01-05": 5
}
function filterObjectByKey( o, sec ){
  const keys = Object.keys(sec);
  return Object.entries(o).reduce((acc, [k,v])=>{
    acc[k] = keys.includes(k) ? v : 0;
    return acc;
  }, {});
}
const filtered = filterObjectByKey( original, secondary );

console.log( filtered );

也许您可以使用某种形式的迭代与合并运算符 (||)...

someObjArray.forEach(function(x) {
    return {
        // if the obj does not have key/value pair for that date, it will use 0 (the value to the right of ||)
        2021-12-23: (x['2021-12-23'] || 0),
        2021-12-24: (x['2021-12-24'] || 0),
        2021-12-27: (x['2021-12-27'] || 0),
        2022-01-05: (x['2021-01-05'] || 0)
    }
 });