【问题标题】:Get previous object item in javascript在javascript中获取上一个对象项
【发布时间】:2019-10-25 19:35:32
【问题描述】:

我有一个带有键和数据的对象。从一个键我想得到上一个项目。

我以前见过类似的主题,但解决方案确实很复杂。

我还添加了一个不起作用的功能,但我希望它会起作用

简化代码

let obj = {
  slug:        'my-page',
  title:       'My title',
  description: 'My description',
  content:     'My content'
};

let previous = obj.previousItem('description'); // Does not work

console.log(previous);

预期结果

{ 标题:'我的标题' }

  • ES5 甚至 ES6 都可以
  • 我更喜欢简单的解决方案而不是复杂的解决方案,可能没有循环

【问题讨论】:

  • 如果你依赖顺序,你应该使用数组。
  • 一般来说,对象属性是无序的
  • 虽然现在大多数浏览器都有固定的迭代顺序,但在最新版本之前的所有 JS 版本的规范并不能保证属性的顺序。因此,如果您必须 100% 确定某物的顺序,请使用数组。在这种情况下,它相当简单。一个基本的“分页”包装器,您可以在其中保存当前索引并将.prev().next() 减去/添加到索引并返回。可以使用迭代器制作更复杂的版本。
  • 数组的替代方案是 Map,它将保留插入顺序。但总的来说,有很多 dupes 用于此。

标签: javascript object ecmascript-6 ecmascript-5


【解决方案1】:

您可以尝试关注获取上一条

let object = {
    slug: 'my-page',
    title: 'My title',
    description: 'My description',
    content: 'My content'
}
let previous = previousItem(object, 'description');
console.log(previous);


function previousItem(object, str) {
    let lastKey = "";

    for (const key in object) {
        if (object.hasOwnProperty(key)) {
            if (key == str){
                lastKey = lastKey || key;
                let obj = { };
                obj[lastKey] = object[lastKey];
                return obj;
            } else {
                lastKey = key;
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    Object.prototype.previousItem = function(propName) {
      const arr = Object.keys(this);
      let indx = arr.indexOf(propName)-1;
      if (indx<0) return null;
      const result = Object.create(null); // just clear output
      result[arr[indx]] = this[arr[indx]];
      return result;
    }
    
    let obj = {
      slug:        'my-page',
      title:       'My title',
      description: 'My description',
      content:     'My content'
    };
    
    let previous = obj.previousItem('description'); //  work
    
    console.log(previous);

    【讨论】:

      【解决方案3】:

      对象过去是没有顺序的,但实际上他们有,我不会依赖这个顺序。

      但无论如何,您可以通过下一个键/值对过滤并获取一个对象。

      let obj = { slug: 'my-page', title: 'My title', description: 'My description', content: 'My content' },
          previous = Object.fromEntries(Object
              .entries(obj)
              .filter((_, i, { [i + 1]: next = [] }) => next[0] === 'description')
          );
      
      console.log(previous);

      【讨论】:

      • 虽然这将按预期工作,但不能保证对象属性顺序,因此,这通常是个坏主意。引用对象定义:4.3.3 Object An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function. 但是,ES6 Map 类似,保证顺序。所以我建议改用它
      • 我知道这个,假设 op 也知道这个。
      【解决方案4】:

      我觉得有些人是这样的

      Object.prototype.previousItem = function(propName) {
        const arr = Object.keys(this);
        let indx = arr.indexOf(propName)-1;
        if (indx<0) return null;
        const result = {};
        result[arr[indx]] = this[arr[indx]];
        return result;
      }
      

      【讨论】:

      • 最好使用Object.getOwnPropertyNames。 ES6 需要这个来维持秩序,Object.keys 不是必需的。
      • 不确定。数组中可枚举属性的顺序与 for...in 循环(或 Object.keys())在对象属性上公开的顺序一致。
      • 是的,但我只想运行 Jens 代码,而不是创建最好的应用程序。无论如何,这是一个很奇怪的愿望
      • stackoverflow.com/questions/30076219/…。它说 ES6 不需要为 for-inObject.keys() 排序,但它确实需要为许多其他 Object 方法排序。
      猜你喜欢
      • 2011-05-18
      • 2019-04-17
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2021-11-09
      相关资源
      最近更新 更多