【问题标题】:Keep only selected keys in every object from array [duplicate]仅保留数组中每个对象中的选定键[重复]
【发布时间】:2019-02-27 14:20:14
【问题描述】:

编辑:不是重复的,因为我的问题不要求删除特定键,而是在数组中找不到所有键。

在下面,函数redux1data 对象中删除与keys_to_keep 中未列出的键对应的条目。

鉴于我有一个要保留的对象键列表,我如何以更简洁的方式重写redux1,最好是使用mapfilterreduce

var data = [
	{name: 'John', city: 'London', age: 42},
	{name: 'Mike', city: 'Warsaw', age: 18},
	{name: 'Jim', city: 'New York', age: 22},
	{name: 'Celine', city: 'Tokyo', age: 54},
]

var keys_to_keep = ['name', 'city']

function redux1(data) {
	data.forEach((person) => {
		Object.keys(person).forEach((key) => {
			if (!keys_to_keep.includes(key)) {
				delete (person[key])
			}
		})
	})
	console.log(data)
}

function redux2(data) {	
	var reduced = data.filter(person => Object.keys(person).filter(key => keys_to_keep.includes(key)))
	console.log(reduced)
}

redux1(data)
//redux2(data)

我当前的redux2 将返回对象不会删除age

【问题讨论】:

  • "...以更简洁的方式" - 你的功能有什么不“干净”的地方? “...最好使用 map、filter 或 reduce?” - 为什么是这三个?
  • @Heretic Monkey,不是重复的。我知道这个答案,但它只涉及删除特定键,而不是数组中未找到的所有键。
  • 那么你应该在你的问题中提到这一点。 stackoverflow.com/help/duplicates

标签: javascript


【解决方案1】:

您可以使用Array#mapArray#reduce 的组合:

const data = [
	{name: 'John', city: 'London', age: 42},
	{name: 'Mike', city: 'Warsaw', age: 18},
	{name: 'Jim', city: 'New York', age: 22},
	{name: 'Celine', city: 'Tokyo', age: 54},
]

const keys_to_keep = ['name', 'city'];

const redux = array => array.map(o => keys_to_keep.reduce((acc, curr) => {
  acc[curr] = o[curr];
  return acc;
}, {}));

console.log(redux(data));

【讨论】:

  • 这是我遇到的最优雅的实现之一。 +10
【解决方案2】:

使用Array#mapObject.fromEntries() 的版本略短于接受的答案:

const data = [
    {name: 'John', city: 'London', age: 42},
    {name: 'Mike', city: 'Warsaw', age: 18},
    {name: 'Jim', city: 'New York', age: 22},
    {name: 'Celine', city: 'Tokyo', age: 54},
]

const keys_to_keep = ['name', 'city'];

const redux1 = list => list.map(o => Object.fromEntries(
    keys_to_keep.map(k => [k, o[k]])
));

console.log(redux1(data));

【讨论】:

    【解决方案3】:

    在其中使用 Array.map 和 Array.forEach :

    var data = [
    	{name: 'John', city: 'London', age: 42},
    	{name: 'Mike', city: 'Warsaw', age: 18},
    	{name: 'Jim', city: 'New York', age: 22},
    	{name: 'Celine', city: 'Tokyo', age: 54},
    ]
    
    var keys_to_keep = ['name', 'city']
    
    const result = data.map(e => {
      const obj = {};
      keys_to_keep.forEach(k => obj[k] = e[k])
      return obj;
    });
    
    console.log(result);

    【讨论】:

      【解决方案4】:

      var data = [
      	{name: 'John', city: 'London', age: 42},
      	{name: 'Mike', city: 'Warsaw', age: 18},
      	{name: 'Jim', city: 'New York', age: 22},
      	{name: 'Celine', city: 'Tokyo', age: 54},
      ]
      
      var keys_to_keep = ['name', 'city']
      
      data=data.map(element => Object.assign({}, ...keys_to_keep.map(key => ({[key]: element[key]}))))
      
      console.log(data)

      【讨论】:

        【解决方案5】:
        data.reduce((r, c) => [ ...r, Object.entries(c).reduce((b, [k, v]) => keys_to_keep.includes(k) ? {...b, [k]: v } : b, {}) ],[])
        

        【讨论】:

          【解决方案6】:

          您可以使用Object.entries

          function objfilter(data,keys_to_keep){
              return Object.fromEntries(Object.entries(data).filter(a=>keys_to_keep.includes(a[0])))
          }
          const data = [
              {name: 'John', city: 'London', age: 42},
              {name: 'Mike', city: 'Warsaw', age: 18},
              {name: 'Jim', city: 'New York', age: 22},
              {name: 'Celine', city: 'Tokyo', age: 54},
          ]
          
          const keys_to_keep = ['name', 'city'];
          
          console.log(objfilter(data,keys_to_keep))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-23
            • 2015-08-24
            • 1970-01-01
            相关资源
            最近更新 更多