【问题标题】:How to make array of object with limmited values如何制作具有有限值的对象数组
【发布时间】:2022-01-01 05:27:09
【问题描述】:

对不起,如果标题不清楚,请提前说明,但很难用语言来描述。

我有什么:

const obj = {
 a: 5,
 b: 3,
 c: 0,
 d: 9
}

我想拥有什么:

const arr = [[a, 5] ,[b, 3]]

基本上,我尝试编写一个返回条目数组的函数,但它太符合要求:

  • 当值等于 0 时不想要对象
  • 值的总和必须小于 10

第一点对我来说很容易,我可以做到

Object.entries(obj).filter(([k, v])=> v !== 0)

但我无法处理第二个。

我可以在这里使用reduce 吗?

【问题讨论】:

  • 有点不清楚:如果总和大于 10 会发生什么?
  • 为什么不[['d', 9]]
  • 如果你有f: 4 怎么办——那也可能产生[["a", 5], ["f", 4]][["b", 3], ["f", 4]]?以及如何选择正确的输出?
  • 另外,{ a: 5, b: 9, c: 0, d: 3 } 的预期输出是什么 - 它是 [["a", 5], ["d", 3]][["a", 5]]
  • 如果你有e: 1怎么办?它应该添加到结果集中吗?

标签: javascript arrays filter reduce


【解决方案1】:

您可以使用closureIIFE 来存储总和

Object.entries(obj).filter((() => {
  let sum = 0;
  return ([k, v]) => { sum += v; return v !== 0 && sum < 10; }; 
})());

示例:

function convert(obj) {
  return Object.entries(obj).filter((() => {
    let sum = 0;
    return ([k, v]) => { sum += v; return v !== 0 && sum < 10; }; 
  })());
}

const obj = { a: 5, b: 3, c: 0, d: 9 };
const arr = convert(obj);
console.log(arr);

const obj2 = { a: 0, b: 0, c: 8, d: 0, e: 1, f: 5 };
const arr2 = convert(obj2);
console.log(arr2);

const obj3 = { a: 12 };
const arr3 = convert(obj3);
console.log(arr3);

【讨论】:

    【解决方案2】:

    @jabaa's answer 很棒,你应该接受它。

    为了确认你的直觉,你可以使用reduce,但它会变得相当复杂:

    const obj = {
     a: 5,
     b: 3,
     c: 0,
     d: 9
    }
    
    const result = Object.entries(obj).reduce(
      (o, newPair) => {
         o.sum += newPair[1];
         newPair[1] !== 0 && o.sum < 10 && o.pairs.push(newPair);
         return o;
      },
      {
         sum: 0,
         pairs: []
      }
    ).pairs;
    
    console.log(result)

    【讨论】:

    • 确实,绝对!
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2016-02-14
    • 2022-01-07
    相关资源
    最近更新 更多