【问题标题】:formatting data in new structure以新结构格式化数据
【发布时间】:2017-12-18 10:40:41
【问题描述】:

我目前有 1 个带有标签的数组和 2 个带有键和值的对象。 有了这些数据,我想用对象格式化一个新数组。

例子:

const years = ["5", "6", "7", "8", "9"];
const left = {5: 2, 6: 1, 7: 22};
const right = {6: 1, 7: 1, 8: 22, 9: 1};

//Output should be
const newArr = [
    {
        label: 5 year,
        left: 2,
        right: null,
    },
    {
        label: 6 year,
        left: 1,
        right: 1,
    },
    {
        label: 7 year,
        left: 22,
        right: 1,
    },
    {
        label: 8 year,
        left: null,
        right: 22,
    },
    {
        label: 9 year,
        left: null,
        right: 1,
    },
]

如果其中一个对象在对象中没有年份(键),则此值为空。

【问题讨论】:

  • 你的意思是什么?
  • 您应该尝试解决问题并发布您尝试过的解决方案,而不是直接跳转到 SO。

标签: javascript arrays object


【解决方案1】:

使用map

var replaceFn = ( obj, key ) => !obj.hasOwnProperty( key ) ? null : obj[ key ]; 

var output = years.map( s => ({ 
         label : s + " years", 
         left : replaceFn( left, s ), 
         right : replaceFn( right, s ) 
}));

演示

var years = ["5", "6", "7", "8", "9"];
var left = {5: 2, 6: 1, 7: 22, 8: undefined};
var right = {6: 1, 7: 1, 8: 22, 9: 1};

console.log( left.hasOwnProperty( 8 ) );

var replaceFn = ( obj, key ) => !obj.hasOwnProperty( key ) ? null : obj[ key ]; 

var output = years.map( s => ({ 
         label : s + " years", 
         left : replaceFn( left, s ), 
         right : replaceFn( right, s ) 
}));

console.log( output );

【讨论】:

  • 不错的解决方案,对于 OP 来说可能有点复杂,但非常整洁。
  • @user184994 是的,在演示中已经这样做了,但现在在主要答案中也得到了纠正。
  • 当然@tushar,我也会解决这个问题。
  • @Baruch 为什么你认为使用mapforEachpush 更复杂?
  • @RalphJanssen 很高兴它对你有用。我已经进行了一些更改以处理将 falsey 值赋予对象的键以正确处理 如果其中一个对象在对象中没有年份(键)的条件的情况此值为空。.
【解决方案2】:

只需循环遍历years数组并从其他两个对象中动态获取值:

const years = ["5", "6", "7", "8", "9"];
const left = {5: 2, 6: 1, 7: 22};
const right = {6: 1, 7: 1, 8: 22, 9: 1};

const newArr = [];

years.forEach(year => {
  newArr.push({
    label: `${year} year(s)`,
    right: right[year] || null,
    left: left[year] || null,
  })
});

示例:https://repl.it/repls/StingyIrritatingCrayfish

【讨论】:

    【解决方案3】:

    您可以检查键是否在对象中 (in operator) 并取值,否则取 null

    var years = ["5", "6", "7", "8", "9"],
        left = { 5: 2, 6: 1, 7: 22 },
        right = { 6: 1, 7: 1, 8: 22, 9: 1 },
        result = years.map(k => ({
            label: k + ' year',
            left: k in left ? left[k] : null,
            right: k in right ? right[k] : null
        }));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多