具有非空值的唯一键

时间:2020-01-27 11:16:23

标签: javascript arrays object

我有一个像这样的数组:

const es = [
  ['A', 'A1'], // first A key
  ['B', null],
  ['C', null],
  ['A', null], // second A key
  ['B', null],
  ['C', null],
  ['D', 'D2']
]

我想要的是:

const res = {
  A: 'A1',
  B: null,
  C: null,
  D: 'D2'
}

所以我想要一个带有唯一键的对象,如果存在重复的键(例如ABC)具有不同的值,则该键的值不能为null值。

要获得res,我可以这样做:

const res = Object.fromEntries(flatten(es))

但是在这种情况下,res是:

res = {
    A: null,
    B: null,
    C: null
  }

我认为是因为Object.fromEntries“使set”和第二个A键替换了第一个。
那么,哪种是我想要做的最好方法?

5 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

仅在以下情况下才需要设置新值:

  • 值是空的nullundefined
  • 这两个值都存在并且有效

想法是分配第一个值并替换为最新的非空值。

const es = [
  ['A', 'A1'], // first A key
  ['B', null],
  ['C', null],
  ['A', null], // second A key
  ['B', null],
  ['C', null],
  ['D', 'D2']
]

const result = es.reduce((acc, [ key, value ]) => {  
  if (acc[ key ] == null || !!acc[ key ] && !!value) acc[key] = value;
  return acc
}, {});

console.log(result)

答案 1 :(得分:2)

使用Array.reduce()

const es = [
  ['A', 'A1'],
  ['B', null],
  ['C', null],
  ['A', null],
  ['B', null],
  ['C', null],
  ['D', 'D2']
]

const reduced = es.reduce((accumulator, currentItem) => {
  const [key, value] = currentItem
  accumulator[key] = accumulator[key] || value
  return accumulator
}, {})

console.log(reduced)

答案 2 :(得分:1)

我只使用一个循环,检查对象是否不具有该属性或是否具有该属性,但其值为null

const obj = {};
for (const [key, value] of es) {
    if (!(key in obj) || obj[key] === null) {
        obj[key] = value;
    }
}

实时示例:

const es = [
  ['A', 'A1'], // first A key
  ['B', null],
  ['C', null],
  ['A', null], // second A key
  ['B', null],
  ['C', null],
  ['D', 'D2']
];
const obj = {};
for (const [key, value] of es) {
    if (!(key in obj) || obj[key] === null) {
        obj[key] = value;
    }
}
console.log(obj);

关于Dialog for creating empty activity,以上是第一个,因此,如果需要其他选项之一,则需要相应地进行调整。

答案 3 :(得分:0)

您可以使用一个简单的forEach循环来迭代内部数组,并在它们仍为null的情况下更新现有的对象属性,但是有一个新值:

const es = [
  ['A', 'A1'], // first A key
  ['B', null],
  ['C', null],
  ['A', null], // second A key
  ['B', null],
  ['C', null],
  ['D', 'D2']
]

let obj = {};
es.forEach(arr => {
  // check if object key does not exist yet; or has null value and can be updated with non-null value
  if (!obj.hasOwnProperty(arr[0]) || (obj[arr[0]] === null && arr[1] !== null)) {
    obj[arr[0]] = arr[1];
  }
});
console.info(obj);

答案 4 :(得分:0)

我认为您应该使用map和set的组合。这是与众多物品区分开的最简单方法

var es =[
  ['A', 'A1'], // first A key
  ['B', null],
  ['C', null],
  ['A', null], // second A key
  ['B', null],
  ['C', null],
  ['D', 'D2']
]
var obj={};
var dist = [...new Set(es.map(function(x){
if(!obj[x[0]])
obj[x[0]] = x[1];
return obj;
}))][0]
console.log(dist);